清除Windows窗体中除特殊窗体外的所有文本框

时间:2016-07-27 15:21:00

标签: c# winforms

我正在使用以下代码清除表单中的所有文本框。

protected static IEnumerable<Control> GetAllChildren(Control root)
        {
            var stack = new Stack<Control>();
            stack.Push(root);
            while (stack.Any())
            {
                var next = stack.Pop();
                foreach (Control child in next.Controls)
                    stack.Push(child);
                yield return next;
            }
        }

internal static void ResetTextBoxes(Control root, string resetWith = "", params TextBox[] except)
        {
            try
            {
                foreach (TextBox txt in GetAllChildren(root).OfType<TextBox>())
                {
                    foreach (TextBox txtException in except)
                    {
                        if (txtException.Name != txt.Name)
                        {
                            txt.Text = resetWith == "" ? string.Empty : resetWith;
                        }
                    }
                }
            }
            catch (Exception ex) { throw ex; }
        }

我尝试将一些我不想使用params清除的特殊文本框分开,但它仍会清除所有框。需要帮助。

3 个答案:

答案 0 :(得分:2)

GetAllChildren的缩短版本:

protected static IEnumerable<Control> GetAllChildren(Control root) {
  return new Control[] { root }
    .Concat(root.Controls
      .OfType<Control>()
      .SelectMany(item => GetAllChildren(item)));
}

更短的Linq:

var source = GetAllChildren(root)
  .OfType<TextBox>()
  .Where(ctrl => !except.Contains(ctrl));

foreach (var textBox in source)
  textBox.Text = resetWith;

当前实施的问题位于内部循环中:

foreach (TextBox txtException in except)
  if (txtException.Name != txt.Name)
    txt.Text = resetWith == "" ? string.Empty : resetWith;

如果您至少两个例外不同的名称

 txtException.Name != txt.Name

将不可避免地满足(任何txt.Name 不等于第一个例外或第二个例外

答案 1 :(得分:0)

这种情况正在发生,因为您正在针对第二个集合的所有元素测试第一个集合的所有元素,因此即使.cd-side-nav { position: fixed; }数组中存在文本框,它的名称也不会与其他文本框匹配。 请改用Linq的test = "AAATGG" TestDict = {} for index,i in enumerate(test[:-1]): string = "" if test[index] == test[index+1]: string = i + test[index] else: break print string 扩展方法:

except

答案 2 :(得分:0)

这是我使用的功能:

    public void ClearAllFields(Control con)
    {
        foreach (Control c in con.Controls)
        {
            if (c is TextBox && c != null)
            {
                if (c.Name != "specialtxtbox1name" && c.Name != "specialtxtbox2name" && c.Name != "nameoftextbox") // just put in the name of special textBoxes between double quotes
                    c.Text = "";
            }
            else
            {
                ClearAllFields(c);
            }
        }

    }

只需在任何需要的地方调用该功能

示例:

    private void InsertDatathenClearForm_Click(object sender, EventArgs e)
       {
               //Code
               //.
               //.
                File.Create(filepath);
                MessageBox.Show("All Textboxes Data saved successfully");
               //Clear fxn
                ClearAllFields(this);
      }

}