【问题标题】:Reset all the items in a form重置表单中的所有项目
【发布时间】:2013-03-12 06:26:17
【问题描述】:

我想知道,有没有一种方法可以将所有复选框、文本框、数字和其他控件重置为默认值,而无需为每个控件单独编写代码?这是我尝试过的代码,但似乎不起作用:

for (int i = 0; i < this.Controls.Count; i++)
{
    this.Controls[i].ResetText();
}

编辑:
我已经通过手动设置控制值来修复它,抱歉所有麻烦>.<.>

【问题讨论】:

  • 我想因为你只是循环控制的顶层,你必须递归检查控件并执行ResetText()(所以如果你有你的文本框,然后在面板中说复选框这不会检查面板中的控件)
  • @V4Vendetta 我明白了,有没有办法让这成为可能?还是我必须检查所有面板和其他容器?
  • 是的,有可能。看我的回答。
  • @ispiro 是的,它有点工作,但它也会重置标签:p。正在尝试解决这个问题。
  • 好吧,你可以做foreach (Control c in this.Controls) { if (c is TextBox) { c.ResetText(); } } - 或类似的东西。不需要使用 for-loop

标签: c# winforms reset


【解决方案1】:

如下创建类并像这样调用它

检查:Reset all Controls (Textbox, ComboBox, CheckBox, ListBox) in a Windows Form using C#

private void button1_Click(object sender, EventArgs e)
{
   Utilities.ResetAllControls(this);
}

public class Utilities
    {
        public static void ResetAllControls(Control form)
        {
            foreach (Control control in form.Controls)
            {
                if (control is TextBox)
                {
                    TextBox textBox = (TextBox)control;
                    textBox.Text = null;
                }

                if (control is ComboBox)
                {
                    ComboBox comboBox = (ComboBox)control;
                    if (comboBox.Items.Count > 0)
                        comboBox.SelectedIndex = 0;
                }

                if (control is CheckBox)
                {
                    CheckBox checkBox = (CheckBox)control;
                    checkBox.Checked = false;
                }

                if (control is ListBox)
                {
                    ListBox listBox = (ListBox)control;
                    listBox.ClearSelected();
                }
            }
        }      
    }

【讨论】:

  • 这似乎不起作用,是因为我的物品在TabControl中吗?
  • @FoxyShadoww 我猜你将不得不遍历 TabPages 然后
  • +1 2 年了,这对我来说效果很好。我删除了方法内的foreach 并在声明中进行了交互,因此我不需要特别关注控件。 foreach (Control ctrl in grp1.Controls) { Utilities.ResetAllControls(ctrl); }
  • 如果我可能会问,为什么是Control类型的参数?为什么它不是Form类型?它不应该是一个表单,以便我可以遍历其中的所有控件吗?
【解决方案2】:

您可以重新创建表单并处理旧表单。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void btnReset_Click(object sender, EventArgs e)
    {
        Form1 NewForm = new Form1();           
        NewForm.Show();
        this.Dispose(false);
    }
}

【讨论】:

  • 我知道这个帖子很旧,但我有什么理由不应该这样做吗?这似乎比其他任何答案都容易得多。
  • @VinnyGuitara 如果您要重置表单上的所有项,那么不,没有理由不这样做。如果有人想在这里使用答案来重置表单的一部分,那么这个答案将无济于事。
  • 这可能只适用于非常简单的情况 - 当我尝试在表单生命周期由父表单持有的情况下使用它时,它会产生奇怪的行为。
【解决方案3】:
foreach (Control field in container.Controls)
            {
                if (field is TextBox)
                    ((TextBox)field).Clear();
                else if (field is ComboBox)
                    ((ComboBox)field).SelectedIndex=0;
                else
                    dgView.DataSource = null;
                    ClearAllText(field);
            }

【讨论】:

  • ClearAllText(field);这是什么
  • @AdnanAli 看起来像 WPF
【解决方案4】:

Additional-> 清除子控件 下面的函数也会清除嵌套的(子)控件,封装在一个类中。

 public static void ClearControl(Control control)
        {
            if (control is TextBox)
            {
                TextBox txtbox = (TextBox)control;
                txtbox.Text = string.Empty;
            }
            else if (control is CheckBox)
            {
                CheckBox chkbox = (CheckBox)control;
                chkbox.Checked = false;
            }
            else if (control is RadioButton)
            {
                RadioButton rdbtn = (RadioButton)control;
                rdbtn.Checked = false;
            }
            else if (control is DateTimePicker)
            {
                DateTimePicker dtp = (DateTimePicker)control;
                dtp.Value = DateTime.Now;
            }
            else if (control is ComboBox)
            {
                ComboBox cmb = (ComboBox)control;
                if (cmb.DataSource != null)
                {
                    cmb.SelectedItem = string.Empty;
                    cmb.SelectedValue = 0;
                }
            }
            ClearErrors(control);
            // repeat for combobox, listbox, checkbox and any other controls you want to clear
            if (control.HasChildren)
            {
                foreach (Control child in control.Controls)
                {
                    ClearControl(child);
                }
            }


        }

【讨论】:

    【解决方案5】:

    如果您有一些面板或组框,则重置字段应该是递归的。

    public class Utilities
    {
        public static void ResetAllControls(Control form)
        {
            foreach (Control control in form.Controls)
            {
                RecursiveResetForm(control);
            }
        }
    
        private void RecursiveResetForm(Control control)
        {            
            if (control.HasChildren)
            {
                foreach (Control subControl in control.Controls)
                {
                    RecursiveResetForm(subControl);
                }
            }
            switch (control.GetType().Name)
            {
                case "TextBox":
                    TextBox textBox = (TextBox)control;
                    textBox.Text = null;
                    break;
    
                case "ComboBox":
                    ComboBox comboBox = (ComboBox)control;
                    if (comboBox.Items.Count > 0)
                        comboBox.SelectedIndex = 0;
                    break;
    
                case "CheckBox":
                    CheckBox checkBox = (CheckBox)control;
                    checkBox.Checked = false;
                    break;
    
                case "ListBox":
                    ListBox listBox = (ListBox)control;
                    listBox.ClearSelected();
                    break;
    
                case "NumericUpDown":
                    NumericUpDown numericUpDown = (NumericUpDown)control;
                    numericUpDown.Value = 0;
                    break;
            }
        }        
    }
    

    【讨论】:

    • 如果从方法 ResetAllControls 静态调用,RecursiveResetForm 也需要是静态的。此外,在重置 ComboBox 时,最好将 SelectedIndex 设置为 -1,因为它会清除该框,而不是像您当前那样选择第一个项目。
    【解决方案6】:

    您可以重置某种类型的所有控件。类似的东西

    foreach(TextBox tb in this.Controls.OfType<TextBox>().ToArray())
    {
       tb.Clear();
    }
    

    但你不能一次重置所有控件

    【讨论】:

      【解决方案7】:

      快速回答,也许会有所帮助:

      private void button1_Click(object sender, EventArgs e)
      {            
          Form2 f2 = new Form2();
          f2.ShowDialog();
          while (f2.DialogResult == DialogResult.Retry)
          {
              f2 = new Form2();
              f2.ShowDialog();
          }
      }
      

      在 Form2(“设置”表单)中:

      private void button1_Click(object sender, EventArgs e)
      {
          DialogResult = DialogResult.OK;
          Close();
      }
      
      private void button2_Click(object sender, EventArgs e)
      {
          DialogResult = DialogResult.Retry;
          Close();
      }
      

      【讨论】:

      • 但这会重新启动表单,不是吗?表单启动时正在加载设置,所以我不太确定这是否可行:(。
      • @FoxyShadoww 我不明白。是的,它将重新启动表单。这不是你想要的吗? (如果设置在构造函数中加载 - 它们也将用于新实例。)
      • Okai,我要试一试,但设置是从外部 XML 文件加载的。编辑:是的,由于某种原因,这似乎对我不起作用......
      • @FoxyShadoww 它们是否已加载到 Settings-Form 构造函数中?
      • 不,他们不是。它们通过backgroundworker 加载到Form_Load 事件中。
      【解决方案8】:

      我最近不得不为文本框和复选框执行此操作,但使用的是 JavaScript ...

      How to reset textbox and checkbox controls in an ASP.net document

      这里是代码...

      <script src="http://code.jquery.com/jquery-1.7.1.js" type="text/javascript"></script>
      
      <script type="text/javascript">
            function ResetForm() {
                //get the all the Input type elements in the document
                var AllInputsElements = document.getElementsByTagName('input');
                var TotalInputs = AllInputsElements.length;
      
                //we have to find the checkboxes and uncheck them
                //note: <asp:checkbox renders to <input type="checkbox" after compiling, which is why we use 'input' above
                for(var i=0;i< TotalInputs ; i++ )
                {
                  if(AllInputsElements[i].type =='checkbox')
                  {
                      AllInputsElements[i].checked = false;
                  }
                }
      
                //reset all textbox controls
                $('input[type=text], textarea').val('');
      
                Page_ClientValidateReset();
                return false;
            }
      
            //This function resets all the validation controls so that they don't "fire" up
            //during a post-back.
            function Page_ClientValidateReset() {
                if (typeof (Page_Validators) != "undefined") {
                    for (var i = 0; i < Page_Validators.length; i++) {
                        var validator = Page_Validators[i];
                        validator.isvalid = true;
                        ValidatorUpdateDisplay(validator);
                    }
                }
            }
      </script>
      

      并使用按钮或任何其他方法调用它...

      <asp:button id="btnRESET" runat="server" onclientclick="return ResetForm();" text="RESET" width="100px"></asp:button>
      

      如果您不在您的网站上使用 ValidationControls,只需删除上面引用它的所有代码和调用 Page_ClientValidateReset();

      我相信您可以使用 DOM 为任何其他控件扩展它。而且由于没有post到服务器,所以速度更快,也没有“闪烁”。

      【讨论】:

        【解决方案9】:
            function setToggleInputsinPnl(pnlName) {
            var domCount = pnlName.length;
            for (var i = 0; i < domCount; i++) {
                if (pnlName[i].type == 'text') {
                    pnlName[i].value = '';
                } else if (pnlName[i].type == 'select-one') {
                       pnlName[i].value = '';
                }
            }
        }
        

        【讨论】:

          【解决方案10】:

          有一种非常有效的方法可以用来清除或重置 Windows 窗体 C# 控件,例如 TextBox、ComboBox、RadioButton、CheckBox、DateTimePicker 等。

          private void btnClear_Click(object sender, EventArgs e)
          {
              Utilities.ClearAllControls(this);
          }
          

          internal class Utilities
          {
              internal static void ClearAllControls(Control control)
              {
                  foreach (Control c in control.Controls)
                  {
                      if (c is TextBox)
                      {
                          ((TextBox)c).Clear();
                      }
                      else if (c is ComboBox)
                      {
                          ((ComboBox)c).SelectedIndex = -1;
                      }
                      else if (c is RadioButton)
                      {
                          ((RadioButton)c).Checked = false;
                      }
                      else if (c is CheckBox)
                      {
                          ((CheckBox)c).Checked = false;
                      }
                      else if (c is DateTimePicker)
                      {
                          ((DateTimePicker)c).Value = DateTime.Now; // or null 
                      }
                  }
              }
          }
          

          为了在 c# 中实现整体用户体验,我们可以使用一个语句来清除它们。到目前为止非常简单,上面是代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-10
            • 2012-08-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-11
            相关资源
            最近更新 更多