0

这是我对同一问题的第二个问题,但使这个例子更简单,让我更好地理解你的答案。

我得到“方法'form2'没有重载需要'0'参数”

form1 上的按钮将您带到 form2 并获取文本框的值。Form2 在标签中显示文本框的值。然后我在 form2 上有一个后退按钮,可将您带回 form1。

当我第二次使用以下代码时出现错误:

private void button1_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2();
    frm2.Show();
    this.Hide();
}

以下是此示例的所有代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2(textBox1.Text);
        frm2.Show();
        this.Hide();
    }
}

public partial class Form2 : Form
{
    public string txtbox;

    public Form2(string txtbox)
    {
        InitializeComponent();
        this.txtbox = txtbox;
    }
    private void Form2_Load(object sender, EventArgs e)
    {
        label1.Text = txtbox;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
        this.Hide();
    }
}

有人可以解释一下这个以及如何做到这一点。我还是菜鸟,所以请详细说明。

4

6 回答 6

9

您没有默认构造函数 in Form2,唯一可用的构造函数 inForm2需要一个字符串参数。

您可以在表单中定义无参数构造函数。

public partial class Form2 : Form
{
    public string txtbox;
    public Form2() // a new parameterless constructor
    {
        InitializeComponent();
    }

另一种选择是利用现有的构造函数并在您的按钮单击事件中传递一些字符串值。

Form2 frm2 = new Form2("somestring");// can be empty string as well
于 2012-12-13T11:50:26.563 回答
5

对 - 你已经声明了一个带参数的构造函数:

public Form2(string txtbox)

...并且没有无参数的构造函数。请注意,如果您没有显式声明任何构造函数,编译器只会为您提供无参数构造函数。

但是您尝试不带参数调用构造函数:

Form2 frm2 = new Form2();

想让它做什么?您基本上说过,为了构造 的实例Form2,您必须txtbox参数提供一个值......但您没有这样做。

于 2012-12-13T11:50:50.500 回答
1

这条线是罪魁祸首

Form2 frm2 = new Form2();

Form2 没有不带参数的构造函数。它有一个接受一个参数(一个字符串),所以你要么必须提供一个参数

Form2 frm2 = new Form2("Some string");

或者简单地创建一个默认构造函数

public Form2(){
   InitializeComponent();
   this.txtbox = "Deafult value";
}

如果您需要显示文本并且没有合理的默认值,请坚持只有一个构造函数。如果您可以提供默认值,则默认构造函数可能是一种有效的方法

于 2012-12-13T11:50:41.497 回答
1

它的意思是你没有一个form2的构造函数,基本上看起来像这样

public Form2() { InitializeComponent(); }

() 中的值是方法的参数

编辑:您的问题有两种解决方案..

任何一个

Form2 myForm = new Form2("");

或者

public Form2()
{ 
InitializeComponent();
txtBox.Text = "Defaultvalue";
}
于 2012-12-13T11:52:34.947 回答
1

Form2类中的以下代码是错误的

private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
        this.Hide();
    }

您需要在构造函数中传递一个值:

private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2("Some value here");
        frm2.Show();
        this.Hide();
    }

就像您在 Form1 中所做的一样。

或者,您可以重载 Form2 构造函数,这样您就可以在不传入值的情况下创建:

public Form2() : this(string.Empty){}

//This is your existing constructor
public Form2(string txtbox)
    {
        InitializeComponent();
        this.txtbox = txtbox;
    }
于 2012-12-13T11:53:09.687 回答
1

所有答案都解决了您收到错误的原因以及该怎么做,但我认为您真正想要的是从Form2打开Form1(如您在问题中所述)。

我猜Form2 button1_Click 是你的“返回”按钮。

因此,在Form2 button1_Click 中,更改:

Form2 frm2 = new Form2();
frm2.Show();

到:

Form1 frm = new Form1();
frm.Show();

结果:

public partial class Form2 : Form
{
    /* ... */

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 frm = new Form1();
        frm.Show();
        this.Hide();
    }
}

但是,为了更好地做到这一点,您可能应该将Form2作为对话框打开并让Form1处理结果,这样您就可以重用Form1而不是每次都创建一个新的。

像这样的东西:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2(textBox1.Text);

        // Hide Form1 before opening Form2.
        this.Hide();

        var dialogResult = frm2.ShowDialog(); // This method will freeze until you close Form2.

        // Then we show this form again. You can check the dialogResult if you want some logic.
        this.Show();
    }
}

public partial class Form2 : Form
{
    public string txtbox;

    public Form2(string txtbox)
    {
        InitializeComponent();
        this.txtbox = txtbox;
    }
    private void Form2_Load(object sender, EventArgs e)
    {
        label1.Text = txtbox;
    }
    private void button1_Click(object sender, EventArgs e)
    {
        this.DialogResult = DialogResult.OK; // Not necessary, but good if you want to have some logic.

        // Close this form (Form2) and returns to the Form1 button1_Click.
        this.Close();
    }
}
于 2012-12-13T12:10:13.440 回答