简体   繁体   English

表单中的 Foreach 控件,如何对表单中的所有文本框执行操作?

[英]Foreach Control in form, how can I do something to all the TextBoxes in my Form?

How can I use a Foreach Statement to do something to my TextBoxes?如何使用 Foreach 语句对我的文本框执行某些操作?

foreach (Control X in this.Controls)
{
    Check if the controls is a TextBox, if it is delete it's .Text letters.
}

If you are using C# 3.0 or higher you can do the following如果您使用的是 C# 3.0 或更高版本,您可以执行以下操作

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

Without C# 3.0 you can do the following如果没有 C# 3.0,您可以执行以下操作

foreach ( Control c in this.Controls ) {
  TextBox tb = c as TextBox;
  if ( null != tb ) {
    ...
  }
}

Or even better, write OfType in C# 2.0.或者甚至更好,用 C# 2.0 编写 OfType。

public static IEnumerable<T> OfType<T>(IEnumerable e) where T : class { 
  foreach ( object cur in e ) {
    T val = cur as T;
    if ( val != null ) {
      yield return val;
    }
  }
}

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

You're looking for您正在寻找

foreach (Control x in this.Controls)
{
  if (x is TextBox)
  {
    ((TextBox)x).Text = String.Empty;
  }
}

The trick here is that Controls is not a List<> or IEnumerable but a ControlCollection .这里的技巧是Controls不是List<>IEnumerable而是ControlCollection

I recommend using an extension of Control that will return something more..queriyable ;)我建议使用 Control 的扩展,它会返回更多..可查询的内容;)

public static IEnumerable<Control> All(this ControlCollection controls)
    {
        foreach (Control control in controls)
        {
            foreach (Control grandChild in control.Controls.All())
                yield return grandChild;

            yield return control;
        }
    }

Then you can do :然后你可以这样做:

foreach(var textbox in this.Controls.All().OfType<TextBox>)
{
    // Apply logic to the textbox here
}
foreach (Control X in this.Controls)
{
  if (X is TextBox)
  {
    (X as TextBox).Text = string.Empty;
  }
}

Also you can use LINQ.您也可以使用 LINQ。 For example for clear Textbox text do something like:例如,对于清除Textbox文本,请执行以下操作:

this.Controls.OfType<TextBox>().ToList().ForEach(t => t.Text = string.Empty);

You can do the following:您可以执行以下操作:

foreach (Control X in this.Controls)
{
    TextBox tb = X as TextBox;
    if (tb != null)
    {
        string text = tb.Text;
        // Do something to text...
        tb.Text = string.Empty; // Clears it out...
    }
}

A lot of the above work.很多上面的工作。 Just to add.只是为了补充。 If your textboxes are not directly on the form but are on other container objects like a GroupBox, you will have to get the GroupBox object and then iterate through the GroupBox to access the textboxes contained therein.如果您的文本框不直接位于窗体上,而是位于其他容器对象(如 GroupBox)上,则必须获取 GroupBox 对象,然后遍历 GroupBox 以访问其中包含的文本框。

foreach(Control t in this.Controls.OfType<GroupBox>())
{
   foreach (Control tt in t.Controls.OfType<TextBox>())
   {
        // do stuff
   }
}
foreach (Control x in this.Controls)
{
  if (x is TextBox)
  {
    ((TextBox)x).Text = String.Empty;
//instead of above line we can use 
     ***  x.resetText();
  }
}

Check this:检查这个:

foreach (Control x in this.Controls)
{
    if (x is TextBox)
    {
        x.Text = "";
    }
}

simple using linq, change as you see fit for whatever control your dealing with.简单使用 linq,根据您认为适合您处理的任何控件进行更改。

        private void DisableButtons()
    {
        foreach (var ctl in Controls.OfType<Button>())
        {
            ctl.Enabled = false;
        }
    }

    private void EnableButtons()
    {
        foreach (var ctl in Controls.OfType<Button>())
        {
            ctl.Enabled = true;
        }
    }

Just add other control types:只需添加其他控件类型:

public static void ClearControls(Control c)
{

    foreach (Control Ctrl in c.Controls)
    {
        //Console.WriteLine(Ctrl.GetType().ToString());
        //MessageBox.Show ( (Ctrl.GetType().ToString())) ;
        switch (Ctrl.GetType().ToString())

        {
            case "System.Windows.Forms.CheckBox":
                ((CheckBox)Ctrl).Checked = false;
                break;

            case "System.Windows.Forms.TextBox":
                ((TextBox)Ctrl).Text = "";
                break;

            case "System.Windows.Forms.RichTextBox":
                ((RichTextBox)Ctrl).Text = "";
                break;

            case "System.Windows.Forms.ComboBox":
                ((ComboBox)Ctrl).SelectedIndex = -1;
                ((ComboBox)Ctrl).SelectedIndex = -1;
                break;

            case "System.Windows.Forms.MaskedTextBox":

                ((MaskedTextBox)Ctrl).Text = "";
                break;

            case "Infragistics.Win.UltraWinMaskedEdit.UltraMaskedEdit":
                ((UltraMaskedEdit)Ctrl).Text = "";
                break;

            case "Infragistics.Win.UltraWinEditors.UltraDateTimeEditor":
                DateTime dt = DateTime.Now;
                string shortDate = dt.ToShortDateString();
                ((UltraDateTimeEditor)Ctrl).Text = shortDate;
                break;

            case "System.Windows.Forms.RichTextBox":
                ((RichTextBox)Ctrl).Text = "";
                break;


            case " Infragistics.Win.UltraWinGrid.UltraCombo":
                ((UltraCombo)Ctrl).Text = "";
                break;

            case "Infragistics.Win.UltraWinEditors.UltraCurrencyEditor":
                ((UltraCurrencyEditor)Ctrl).Value = 0.0m;
                break;

            default:
                if (Ctrl.Controls.Count > 0)
                    ClearControls(Ctrl);
                break;

        }

    }
}

Even better, you can encapsule this to clear any type of controls you want in one method, like this:更好的是,您可以封装它以在一种方法中清除您想要的任何类型的控件,如下所示:

public static void EstadoControles<T>(object control, bool estado, bool limpiar = false) where T : Control
        {
            foreach (var textEdits in ((T)control).Controls.OfType<TextEdit>()) textEdits.Enabled = estado;
            foreach (var textLookUpEdits in ((T)control).Controls.OfType<LookUpEdit>()) textLookUpEdits.Enabled = estado;

            if (!limpiar) return;
            {
                foreach (var textEdits in ((T)control).Controls.OfType<TextEdit>()) textEdits.Text = string.Empty;
                foreach (var textLookUpEdits in ((T)control).Controls.OfType<LookUpEdit>()) textLookUpEdits.EditValue = @"-1";
            }
        }
private IEnumerable<TextBox> GetTextBoxes(Control control)
{
    if (control is TextBox textBox)
    {
        yield return textBox;
    }

    if (control.HasChildren)
    {
        foreach (Control ctr in control.Controls)
        {
            foreach (var textbox in GetTextBoxes(ctr))
            {
                yield return textbox;
            }
        }
    }
}

I found this to work very well, but initially I have my textboxes on a panel so none of my textboxes cleared as expected so I added我发现这工作得很好,但最初我在面板上有我的文本框,所以我的文本框都没有按预期清除,所以我添加了

this.panel1.Controls.....  

Which got me to thinking that is you have lots of textboxes for different functions and only some need to be cleared out, perhaps using the multiple panel hierarchies you can target just a few and not all.这让我想到,你有很多不同功能的文本框,只有一些需要清除,也许使用多个面板层次结构,你可以只针对少数而不是全部。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何以另一种形式将我的数据网格视图项显示到文本框? - How do I display my datagrid view items to textboxes in a another form? 我想在其中添加标签和文本框的集合 <div class=“form-inliine”> 我怎样才能做到这一点? - I want to add collection of Labels & textboxes in <div class=“form-inliine”> how can I do this? 如何使控件在表单上不可见 - How do I make a control invisible on my form C#。 如何为表单中的所有标签赋予相同的名称,因此,如果对象与标签之一绑定,它将显示一些内容 - C#. How can I give all labels in my form the same name, so if an object bounds with one of the labels that it will show something 如何将datagridview的数据传递到其他表单的文本框? - How can I pass data of datagridview to textboxes in other Form? 如何清除表单中所有textBoxes的文字? - How to clear the text of all textBoxes in the form? 如何使我的 Form Control 变量可以访问我的 Form 类以外的类? - How can I make my Form Control variables acessible to classes other than my Form class? 我想让表单上的所有文本框都接受仅包含尽可能少的代码的数字-C# - I want make all textboxes on my form to accept only numbers with as little code as possible - c# 如何在WebBrowser控件中提交表单? - how do I submit a form in a WebBrowser control? 如何在List中创建一个好的谓词委托给Find() <T> ? - How do I form a good predicate delegate to Find() something in my List<T>?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM