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

本文关键字:另一种 参数 方法 调用 何调用 一个 | 更新日期: 2023-09-27 18:13:19

我有一个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()中的组控件??我试图在form2的顶部做一个公共控制组控件,然后离开我的form1作为Inputform.CleartheForm(Control groupofcontorls),但后来它说我没有对象参考。如果我把它留空,它说Inputform.CleartheForm();不接受0参数

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

好吧,如果你想清除所有控件在InputForm你可以写另一个版本的CleartheForm()没有参数,并调用版本一个参数,像这样:

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

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

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

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

因为Form继承自Control,你可以用form作为参数来调用你的方法——它将清除其中所有的TextBoxesCheckBoxes:

Inputform.CleartheForm(Inputform);

但是,您可以简单地创建new(和空!)每次输入form

对于你的方法-你应该写

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

从你所说的(即你把groupofcontrols作为公共的form2),这应该工作:

Inputform.CleartheForm(Inputform.groupofcontrols);

(这是考虑到Inputform是主窗体上的属性或字段-我观察到它是在它上调用ShowDialog。)

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

如果是:

  1. Form1打开Form2
  2. 用户输入数据到Form2
  3. 用户按下Form2上的OK键
  4. Form2关闭
  5. Form1反映了用户在Form2
  6. 中所做的更改
  7. 用户可以从步骤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();
  }
}

我个人会把这个方法移到类库中。你可以把它设为静态类然后调用

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
}