【问题标题】:No overload for method 'form2' takes '0' arguments方法'form2'没有重载需要'0'参数
【发布时间】:2012-12-13 11:48:57
【问题描述】:

这是我针对同一问题的第二个问题,但使这个示例更加简单,我可以更好地理解您的答案。

我得到“方法 '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();
    }
}

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

【问题讨论】:

    标签: c# winforms visual-studio


    【解决方案1】:

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

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

    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
    

    【讨论】:

    • 此行导致问题:Form2 frm2 = new Form2();。需要string txtbox
    【解决方案2】:

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

    public Form2(string txtbox)
    

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

    但你试图调用没有参数的构造函数:

    Form2 frm2 = new Form2();
    

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

    【讨论】:

    • +1 - 更不用说设计师可能会遇到的问题。当然,公开属性会是更好的方法。
    【解决方案3】:

    这条线是罪魁祸首

    Form2 frm2 = new Form2();
    

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

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

    或者干脆创建一个默认构造函数

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

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

    【讨论】:

      【解决方案4】:

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

      public Form2() { InitializeComponent(); }

      () 中的值是方法的参数

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

      要么

      Form2 myForm = new Form2("");
      

      public Form2()
      { 
      InitializeComponent();
      txtBox.Text = "Defaultvalue";
      }
      

      【讨论】:

        【解决方案5】:

        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;
            }
        

        【讨论】:

          【解决方案6】:

          所有答案都解决了您收到错误的原因以及该怎么做,但我认为您真正想要的是从 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();
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-26
            • 1970-01-01
            相关资源
            最近更新 更多