0

我正在尝试查找我已在表单上输入信息的文本框,并将表单中的其余文本框设为空白并锁定,因此无法将任何信息输入其中。

问题是当我运行代码和调试时。循环浏览表单时,我似乎没有找到表单上的所有文本框。

我试图通过尝试查找 groupbox name.equals 以及 groupbox 中的项目是否等于文本来更改 foreach 中的一些信息。我假设我对 foreach 语句犯了错误。

下面是我的代码。

 foreach (Control C in this.Controls)
            {
                if (C is GroupBox)

                    foreach (Control T in this.Controls)
                    {
                        if (T is TextBox)
                        {
                            {
                                if (T.Text != string.Empty && T.Name.Equals("txtlotno"))
                                {
                                    txtheads.Enabled = false;
                                    txtheads.BackColor = Color.LightGray;
                                    GroupBoxHeads.BackColor = Color.LightSlateGray;
                                    txtrisersgood.Enabled = false;
                                    txtrisersgood.BackColor = Color.LightGray;
                                    GroupBoxRisers.BackColor = Color.LightSlateGray;
                                }

                                else if (T.Text != string.Empty && T.Name.Equals("txtvingot"))
                                {
                                    txtheads.Enabled = false;
                                    txtheads.BackColor = Color.LightGray;
                                    GroupBoxHeads.BackColor = Color.LightSlateGray;
                                    txtrisersgood.Enabled = false;
                                    txtrisersgood.BackColor = Color.LightGray;
                                    GroupBoxRisers.BackColor = Color.LightSlateGray;
                                }
                                else if (T.Text != string.Empty && T.Name.Equals("txtheads"))
                                {
                                    txtvingot.Enabled = false;
                                    txtvingot.BackColor = Color.LightGray;
                                    txtlotno.Enabled = false;
                                    txtlotno.BackColor = Color.LightGray;
                                    GroupBoxIngot.BackColor = Color.LightSlateGray;
                                    txtrisersgood.Enabled = false;
                                    txtrisersgood.BackColor = Color.LightGray;
                                    GroupBoxRisers.BackColor = Color.LightSlateGray;
                                }
                                else if (T.Text != string.Empty && T.Name.Equals("txtrisersgood"))
                                {
                                    txtvingot.Enabled = false;
                                    txtvingot.BackColor = Color.LightGray;
                                    txtlotno.Enabled = false;
                                    txtlotno.BackColor = Color.LightGray;
                                    GroupBoxHeads.BackColor = Color.LightSlateGray;
                                    txtheads.Enabled = false;
                                    txtheads.BackColor = Color.LightGray;
                                    GroupBoxIngot.BackColor = Color.LightSlateGray;
                                }
                            }
                        }
                    }
            }
4

4 回答 4

6

循环初始化中有一个简单的错误

foreach (Control C in this.Controls)
{
     if (C is GroupBox)
     {
        foreach (Control T in C.Controls)
        {

         ......

第二个 foreach 应该在 groupbox 的控件上工作,而不是在this.Controls.
当然,这些循环仅适用于 GroupBox 中包含的 TextBox。如果您在任何 GroupBox 之外有一个 TextBox,则此代码将找不到它们-

但是,为什么需要循环?
您更改了有限数量的文本框,因此您可以直接访问文本框

 if (txtlotno.Text != string.Empty)
 {
     txtheads.Enabled = false;
     txtheads.BackColor = Color.LightGray;
     GroupBoxHeads.BackColor = Color.LightSlateGray;
     txtrisersgood.Enabled = false;
     txtrisersgood.BackColor = Color.LightGray;
     GroupBoxRisers.BackColor = Color.LightSlateGray;
 }
 .... and so on the the other three
于 2013-05-08T16:10:14.013 回答
1

您的问题似乎是您正在迭代 this.Controls 而不是您的 groupbox 中的控件

但是,循环似乎是多余的,因为您直接按名称访问每个文本框。我可能会尝试这样的事情:

List<TextBox> _disable = new List<TextBox>(); 
List<TextBox _enable = new List<TextBox>(); 

// Gather Textboxes to be disabled and enabled 
foreach(Control c in this.Controls)
{
    GroupBox group = c as GroupBox; 
    if(group == null ) // Not a group box so continue on 
        continue; 
    foreach(Control c in group.Controls)
    {
        TextBox tb = c as TextBox; 
        if(tb == null )
           continue; // Not a textbox so continue on 

        if(!String.IsNullOrWhitespace(tb.Text)) // We have information so add to _enable
           _enable.Add(tb); 
        else 
           _disable.Add(tb); // empty textbox so ... disable 
    }
}

// Enable or Disable Textboxes 
foreach(TextBox tb in _enable)
{
   tb.Enabled = true; 
   tb.BackColor = Colors.White
}

foreach(TextBox tb in _disable)
{
   tb.Enabled = false; 
   tb.BackColor = Colors.LightGrey 
}

这种方法使您可以循环遍历所有组框,遍历所有文本框并组织每个文本框并一起启用/禁用它们,或者如果 _enable 列表为空,则不禁用任何文本框。或者,您可以在此处禁用/启用它们,而不是将它们添加到列表中。

希望这可以帮助

于 2013-05-08T19:43:24.087 回答
0

看来您要遍历 GroupBox 的控件:

foreach (Control C in this.Controls)
        {
            if (C is GroupBox)

                foreach (Control T in C.Controls) // loop GroupBox controls
                ...
于 2013-05-08T16:12:16.253 回答
0

在 WPF 中,我使用以下过程来获取主 Grid 及其嵌套容器中的所有 TextBox 控件。同样的方法也应该适用于您的情况。

private List<TextBox> GetTB(Grid Grd)
{
    List<TextBox> _lstT = new List<TextBox>();
    try
    {
        // get ALL TextBox in main Grid and sub Grid/UniformGrid
        UIElementCollection _mainGrd = Grd.Children;
        foreach (UIElement el in _mainGrd)
        {
            if (el is TextBox) { _lstT.Add((TextBox)el); }
            else if (el is Grid)
            {
                foreach (UIElement el1 in ((Grid)el).Children)
                { if (el1 is TextBox) { _lstT.Add((TextBox)el1); } }
            }
            else if (el is UniformGrid)
            {
                foreach (UIElement el1 in ((UniformGrid)el).Children)
                { if (el1 is TextBox) { _lstT.Add((TextBox)el1); } }
            }
        }
        return _lstT;
    }
    catch { throw; }
}
于 2013-05-08T16:16:33.700 回答