如何调用仅接受另一种形式的参数的方法?

时间:2013-05-14 07:33:55

标签: c# forms class

我有一个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()中的groupofcontrol?我试图在form2的顶部创建一个公共Control groupofcontrols,然后将我的form1保留为Inputform.CleartheForm(Control groupofcontorls),但后来它说我没有对象引用。如果我把它留空,它说Inputform.CleartheForm();不会引起争论。

5 个答案:

答案 0 :(得分:0)

好吧,如果您想清除所有 InputForm中的控件,您可以编写另一个版本的CleartheForm()而不带参数,并使用调用版本来自它的参数,如下:

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

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

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

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

答案 1 :(得分:0)

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

Inputform.CleartheForm(Inputform);

但是,可能每次只需创建一个新的(和空!)Inputform。

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

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

远离循环。

答案 2 :(得分:0)

根据你的说法(即你将groupofcontrols公开放在form2上),这应该有效:

Inputform.CleartheForm(Inputform.groupofcontrols);

(这是考虑到Inputform是主窗体上的属性或字段 - 我发现它就像你在其上调用ShowDialog一样。)

答案 3 :(得分:0)

我不了解你的程序的工作流程。

如果是:

  1. Form1打开Form2
  2. 用户输入数据到Form2
  3. 用户按下Form2上的“确定”按钮
  4. Form2关闭
  5. Form1反映用户在Form2中所做的更改
  6. 用户可以从步骤1重复
  7. 您应该为每次迭代使用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 :(得分:0)

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

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
}