如何使用C#在提交后清除或重新生成窗体?

4

我正在使用学生记录输入窗口表单。我希望在提交数据后,表单中的所有字段(例如单选按钮、组合框等)和消息(警告和成功)都应该被重置,以便新用户可以添加数据。

  • 在C#中有没有内置的函数可以重置表单?
  • 还是我需要编写清除方法来实现这一点?
  • 或者我可以重新生成表单吗?

1
不要清理控件并搞得一团糟,尝试使用数据绑定。 - jimjim
7个回答

13

您必须首先清空控件,然后使用InitializeComponent方法才能完美工作。

this.Controls.Clear();
this.InitializeComponent();

欢迎来到stackoverflow!为了提高帖子的准确性,最好为示例代码提供一个简短的描述 :) - Picrofo Software
到目前为止,这是最简单和完美的解决方案! - oliva nikita

2

你可以通过以下两种方式实现:

1)你可以使用一个方法清空表单字段,例如public void clear()。每当你想要清空表单时,只需调用此方法。

2)第二种方法是销毁表单实例,并生成同一表单的新实例,然后显示它。

我建议你使用第一种方法。

这就是我在每个页面中创建的内容。

private void ClearControls()
{
    try
    {
        txtUserName.Text = string.Empty;
        //txtPassword.Text = string.Empty;
        txtFName.Text = string.Empty;
        txtMName.Text = string.Empty;
        txtLName.Text = string.Empty;
        lblUserType.Text = string.Empty;
    btnSave.Text = "Save";
    fnMessage(false, "");
}
catch (Exception ex)
{
    fnMessage(true, ex.Message);
}

}

Thanks


这是一种简陋的做事方式,请尝试使用数据绑定代替。 - jimjim
我不确定这个数据绑定,你能否解释一下如何做呢? - Umesh CHILAKA
Arjang,你能解释一下数据绑定的方法吗? - Touseef Khan

1

你可以重新创建表单实例,或者尝试类似于这个的方法(未经测试):

        foreach (Control ctl in this.Controls)
        {
            switch (ctl.GetType().ToString())
            {
                case "TextBox":
                    ctl.Text = null;
                    break;
                case "ComboBox":
                    ctl.Text = null;
                    break;
            }
        }

显然,您可以包含任意数量的不同类型的控件,并引入其他标准(即控件名称以“xyz”开头或控件位于特定面板内)。

与其他建议相比,这种方法的优点在于,如果您有数十个相同类型的控件(通常是文本框),只需几行代码即可覆盖所有内容。此外,如果您添加更多已覆盖类型的控件,则无需重新访问代码以进行更新。也许您甚至可以将其创建为窗体的扩展方法?


1
  1. 实现数据绑定到给定对象(这里是一个很好的起点
  2. 要重置表单,请创建一个新对象,绑定将为您完成。

希望对你有所帮助。


数据绑定只有在您的应用程序适合该解决方案时才有用。在我的情况下,我的表单下面有(至少)4个对象,并且对象的生命周期与表单的生命周期不直接映射。如果适合,则是一个好的解决方案,但有很多原因可能不适合。 - CJM
首先,数据绑定只会为您节省将表单映射到对象(反之亦然)的代码。其次,如果基础对象的生命周期已经结束,那么在表单上显示什么呢? - Hertzel Guinness
@CJM:请尝试数据绑定,查看链接并给它一个机会,这是编写n-tier的第一步。我保证它一定值得你花时间去学习。 - jimjim
在我的情况下,没有一个对象 - 有几个,并且还有来自外部设备(PLC/测试单元/扫描仪等)的数据。根据外部刺激更新的控件很多 - 大多数不映射到我们记录的数据,因此不映射到我的DAL对象。人为地创建对象只是为了我们可以将其数据绑定到控件上,在这种情况下是没有意义的。数据绑定是一种有用的方法,但它并不是“一刀切”的方法。 - CJM

0

我曾经遇到同样的问题,我的表单包含嵌套控件。我尝试了CJM的方法,它确实起作用,但是由于存在控件嵌套(选项卡控件、容器、用户控件等),我不得不编写递归函数。

如果你想要递归清除整个表单,请尝试以下代码片段:

    private void clearRecursive(Control control)
    {
        foreach (Control subcontrol in control.Controls)
        {
            switch (subcontrol.GetType().ToString().Replace("System.Windows.Forms.", ""))
            {
                case "TextBox":
                    TextBox textBox = (TextBox)subcontrol;
                    textBox.Text = null;
                    break;

                case "ComboBox":
                    ComboBox comboBox = (ComboBox)subcontrol;
                    if (comboBox.Items.Count > 0)
                        comboBox.SelectedIndex = 0;
                    break;

                case "CheckBox":
                    CheckBox checkBox = (CheckBox)subcontrol;
                    checkBox.Checked = false;
                    break;

                case "RadioButton":
                    RadioButton radioButton = (RadioButton)subcontrol;
                    radioButton.Checked = false;
                    break;

                case "TreeView":
                    TreeView tv = (TreeView)subcontrol;
                    foreach (TreeNode node in tv.Nodes)
                    {
                        node.Checked = false;
                        CheckChildren(node, false);
                    }
                    break;

                case "ListBox":
                    ListBox listBox = (ListBox)subcontrol;
                    listBox.Items.Clear();
                    break;

                case "CheckedListBox":
                    CheckedListBox chklstbox = (CheckedListBox)subcontrol;
                    for (int i = 0; i < chklstbox.Items.Count; i++)
                    {
                        chklstbox.SetItemCheckState(i, CheckState.Unchecked);
                    }
                    break;
            }

            if (subcontrol.HasChildren)
                clearRecursive(subcontrol);
        }

    }

0

调用InitializeComponent方法和Form_Load方法。


试一下,你会发现大多数东西都不会被清除。也就是说,在InitializeComponents中没有设置值的所有字段将保持原样... 尝试在表单加载时将dfget输入到一个空的文本框中 :) - Marino Šimić
它们将被清除,因为InitializeComponents方法中只提供了所有控件的新实例。 - Umesh CHILAKA
这是一种简陋的做事方式,请尝试使用数据绑定代替。 - jimjim

0
如果表单创建不需要太多资源,那么创建新实例会更容易。

为什么要手动创建表单,而不使用数据绑定呢? - jimjim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接