【问题标题】:How to clear or regenerate window form after submitting using c#?使用c#提交后如何清除或重新生成窗口表单?
【发布时间】:2011-08-30 23:35:42
【问题描述】:

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

  • 是否有任何内置函数可以在 csharp 中重置表单?
  • 或者我必须为此编写明确的方法?
  • 或者我可以重新生成表单吗?

【问题讨论】:

  • 不要清理控件并开始混乱,而是尝试使用数据绑定。

标签: c# winforms visual-studio forms


【解决方案1】:

您必须先清除控件,然后使用InitializeComponent方法才能完美运行。

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

【讨论】:

  • 欢迎来到stackoverflow!最好为示例代码提供简短描述以提高发布准确性:)
【解决方案2】:

调用InitializeComponent方法和Form_Load方法。

【讨论】:

  • 试一试,你会发现大部分事情都没有搞清楚。 IE。在 InitializeComponents 中未设置值的所有字段将保持原样...尝试将 dfget 发送到表单加载时为空的文本框:)
  • 它们将被清除,因为所有控件的新实例仅在 InitializeComponents 方法中给出
  • 这是很糟糕的做事方式,请尝试使用数据绑定。
【解决方案3】:

因为我有同样的问题,我的 from 有嵌套控件。我尝试了 CJM 的方法并且它有效,但是由于控件嵌套(选项卡控件、容器、用户控件等),我不得不编写一个递归函数

如果你想递归清除整个表单,试试下面的 sn-p

    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);
        }

    }

【讨论】:

    【解决方案4】:

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

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

    显然,您可以根据需要包含任意多种不同类型的控件并引入其他条件(即控件名称以“xyz”开头的位置或控件位于特定面板中的位置)。

    与其他建议相比,这种方法的优势在于,如果您有几十个相同的控件类型(通常是文本框),几行代码就可以解决很多问题。此外,如果您添加更多涵盖类型的控件,则无需重新访问代码来更新它。也许您甚至可以将其创建为表单的扩展方法?

    【讨论】:

      【解决方案5】:

      这可以通过两种方式实现:-

      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);
      }
      

      }

      谢谢

      【讨论】:

      • 这是很糟糕的做事方式,请尝试使用数据绑定。
      • 我不确定这个数据绑定。你能解释一下如何做到这一点。
      • Arjang 能解释一下数据绑定的方法吗?
      【解决方案6】:

      如果表单创建不占用太多资源,则创建新实例会更容易。

      【讨论】:

      • 为什么要在可以使用数据绑定的地方创建表单?
      【解决方案7】:
      1. 实现与给定对象的数据绑定 (good starting point here)
      2. 要重置表单,请创建一个新对象,绑定将为您完成。

      HTH

      【讨论】:

      • 数据绑定仅在您的应用程序适合解决方案时才有用。就我而言,我的表单下方有(最少)4 个对象,并且对象的生命周期并不直接映射到表单的生命周期。如果合适,这是一个很好的解决方案,但有很多原因可能不合适。
      • @CJM 首先,数据绑定只为您节省了将表单映射到对象的代码(反之亦然)。其次,如果底层对象的生命周期已经结束,表单上会显示什么......?
      • @CJM : 请尝试一下数据绑定,看看链接,给它一个机会,这是编写 n-tier 的第一步。绝对值得你花时间我 garentee 它。
      • 在我的例子中没有一个对象 - 有几个,此外还有来自外部设备(PLC/测试单元/扫描仪等)的数据。有许多控件会根据外部刺激进行更新——大多数都没有映射到我们记录的数据,因此没有映射到我的 DAL 对象。在这种情况下,人为地创建对象以便我们可以将数据绑定到控件是没有意义的。数据绑定是一种有用的方法,但它不是“一刀切”的方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2019-03-20
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多