【问题标题】:How do I call a method that only accepts a parameter that is in another form?如何调用只接受另一种形式的参数的方法?
【发布时间】:2013-05-08 09:33:22
【问题描述】:

我有一个 form1(运行程序)和一个 form2(这是一个供用户输入的表单)。 Form2 有一个清除用户输入的功能(文本框、复选框、组合框,它会清除它们)。

函数如下所示:

public void CleartheForm(Control groupofcontrols)
{
    foreach (Control c in groupofcontrols.Controls)
    {
        if (c is TextBox)
        {
            ((TextBox)c).Clear();
        }

        if (c.HasChildren)
        {
            CleartheForm(c);
        }

        if (c is CheckBox)
        {
            ((CheckBox)c).Checked = false;
        }

        label3.Text = "";
        comboBox1.SelectedIndex = -1;
        comboBox2.SelectedIndex = -1;
    }
}

这可以独立运行。在我的主窗体上,我需要调用这个函数,它应该是这样的:

我创建了一个 form2 实例调用 Inputform 然后:

private void Addrecord_Click(object sender, EventArgs e)
{
    Inputform.ShowDialog();

    if(Inputform.Addedrecord == true)
    {
        Inputform.Addrecord();
        Inputform.CleartheForm(WHAT DO I PUT IN HERE??);
    }                   
}

因此,一旦添加了一条记录,输入表单就会自行清除并准备好添加另一条记录。

问题如上,我在里面放什么?如何从form1调用位于form2中的Inputform.CleartheForm()中的groupofcontrols?我试图在 form2 的顶部创建一个公共 Control groupofcontrols,然后将我的 form1 保留为 Inputform.CleartheForm(Control groupofcontorls),但后来它说我没有对象引用。如果我将其留空,则表示Inputform.CleartheForm(); 不接受 0 争论。

【问题讨论】:

    标签: c# forms class


    【解决方案1】:

    好吧,如果您想清除 所有 InputForm 中的控件,您可以编写另一个版本的 CleartheForm() 不带参数,然后调用版本 with 参数从它,像这样:

    public void CleartheForm()
    {
        ClearTheForm(this); // Passes all the controls in the Form.
    }
    

    或者您可以调用原始的 ClearTheForm(Control),并将 InputForm 的引用作为参数传递:InputForm.ClearTheForm(InputForm)

    如果你总是想清除所有控件,为了清楚起见,我会编写一个单独的无参数方法。

    但是,这仅在您想清除 InputForm 中的所有控件时才有用。

    【讨论】:

    • 但他还需要使方法递归,因为他当前的方法会在任何嵌套控件上中断。
    • @Vedran 但它调用的是递归的(即在OP中接受Control参数的那个)
    【解决方案2】:

    因为Form 是从Control 继承的,所以您可以使用表单作为参数调用您的方法 - 它会清除其中的所有TextBoxesCheckBoxes

    Inputform.CleartheForm(Inputform);
    

    但是,您可能每次都可以简单地创建新的(并且是空的!)Inputform。

    而且,对于你的方法 - 你应该把

    label3.Text = "";
    comboBox1.SelectedIndex = -1;
    comboBox2.SelectedIndex = -1;
    

    远离循环。

    【讨论】:

      【解决方案3】:

      从您所说的(即您将 groupofcontrols 在 form2 上公开),这应该可以工作:

      Inputform.CleartheForm(Inputform.groupofcontrols);
      

      (这是考虑到 Inputform 是主表单上的属性或字段 - 我观察到它就像您在其上调用 ShowDialog 一样。)

      【讨论】:

      • Inputform 是 form2 的一个实例,我将其放入 form1 中,例如“form2 Inputform = new form2();”但是按照您上面发布的操作,我得到“对象引用未设置为对象的实例”错误
      • 那么我认为您将错误的控件组公开,请查看您对 form2 的 CleartheForm 调用是否有效。从中您可以找到必须公开的字段(可能位于 form2.designer.cs 中)。
      【解决方案4】:

      我不明白你程序的工作流程。

      如果是:

      1. Form1 打开 Form2
      2. 用户在 Form2 中输入数据
      3. 用户按下 Form2 上的 OK 按钮
      4. Form2 关闭
      5. Form1 反映了用户在 Form2 中所做的更改
      6. 用户可以从第 1 步开始重复

      您应该为每次迭代使用 Form2 的新实例

      为此,您应该从 Form2 中删除所有明确的代码并将代码更改为下一个:

      private void Addrecord_Click(object sender, EventArgs e)
      {
         var inputForm = new Form2();
         inputForm.ShowDialog();
      
         if(inputForm.Addedrecord == true)
         {
              ...Reflect changes here...
         }
      }
      

      但是,如果您需要 Form2 应该保持打开状态,而 Form1 每次在用户单击 Form2 上的“确定”按钮时都会添加新记录

      你应该从Form2调用Form1,下一个设计会很好

      interface IDataTarget
      {
        void Update(int id, string name); // you should reflect here all of your data
      }
      
      class Form1
        : Form, IDataTarget
      {
        public void Update(int id, string name)
        {
           // add new record here
        }
      
        private void AddButton_Click(...)
        {
          using(var form2 = new Form2(this))
          {
             form.ShowDialog(this);
          }
        }
      }
      
      class Form2
        : Form
      {
        private readobly IDataTarget dataTarget;
      
        public Form2(IDatatarget dataTarget)
        {
          this.dataTarget = dataTarget;
        }
      
        private OK_Click(...)
        {
           dataTarget.Update(textBox1.Text, textBox2.Text);
           ClearTheControls();
        }
      }
      

      【讨论】:

      • 是的,程序工作流程和你说的完全一样,4)form2关闭并将Inputform.Addedrecord传递给form1,如果为真,form1添加记录并清除表单。
      【解决方案5】:

      我个人会将这个方法移到类库中。您可以将其设为静态类,然后调用

      FromControls.CleartheForm(Inputform.groupOfControls)
      

      所以,你在类库中的新类是(这里没有测试任何东西,所以很可能出错!)

      public static class FormControls
      {
          public static void CleartheForm(Control groupofcontrols)
          {
              foreach (Control c in groupofcontrols.Controls)
              {
                  if (c is TextBox)
                      ((TextBox)c).Clear();
      
                  if (c.HasChildren)
                       CleartheForm(c);
      
                  if (c is CheckBox)
                      ((CheckBox)c).Checked = false;
              }
          }
      }
      

      我会删除以下代码:

      label3.Text = "";
      comboBox1.SelectedIndex = -1;
      comboBox2.SelectedIndex = -1;
      

      ...因为上面的 CleartheForm 代码将清除它。

      因此,您的代码将是(记得添加对您的类库的引用)

      private void Addrecord_Click(object sender, EventArgs e)
      {
         AddRecord();       
      }
      
      private void AddRecord()
      {
          Inputform.ShowDialog();
      
          if(Inputform.Addedrecord)
          {
              Inputform.Addrecord();
              FromControls.CleartheForm(GetControlOnPage())
          }     
      }
      
      private control GetControlOnPage()
      {
           //logic to return control if needed although it may just be this:  
           return Inputform.groupofcontrols
      }
      

      【讨论】:

        猜你喜欢
        • 2012-02-22
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        • 2016-09-23
        • 1970-01-01
        相关资源
        最近更新 更多