0

我有一个 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??);
    }                   
}

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

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

4

5 回答 5

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
}
于 2013-05-14T07:52:02.050 回答
0

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

Inputform.CleartheForm(Inputform);

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

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

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

远离循环。

于 2013-05-14T07:40:40.657 回答
0

根据您所说的(即您将 groupofcontrols 作为公开形式放在 form2 上),这应该有效:

Inputform.CleartheForm(Inputform.groupofcontrols);

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

于 2013-05-14T07:42:06.333 回答
0

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

如果是:

  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();
  }
}
于 2013-05-14T07:49:01.537 回答
0

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

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

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

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

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

于 2013-05-14T07:38:58.200 回答