我正在尝试找到我在表单上输入信息的文本框,并使表单中的其余文本框变空并锁定,以便不能输入任何信息。
问题是当我运行代码并调试时。在循环浏览时,我似乎没有找到表单上的所有文本框。
我试图通过尝试查找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;
}
}
}
}
}
答案 0 :(得分:6)
循环初始化中存在一个简单的错误
foreach (Control C in this.Controls)
{
if (C is GroupBox)
{
foreach (Control T in C.Controls)
{
......
第二个foreach应该不再在this.Controls
上处理对groupbox的控制
当然,这些循环仅适用于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
答案 1 :(得分:1)
您的问题似乎是您正在遍历this.Controls而不是组框中的控件
但是,循环似乎是多余的,因为您可以按名称直接访问每个文本框。我想尝试这样的事情:
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列表为空则不禁用任何文本框。或者,您可以在此处禁用它们/启用它们,而不是将它们添加到列表中。
希望这有帮助
答案 2 :(得分:0)
您似乎想要遍历GroupBox的控件:
foreach (Control C in this.Controls)
{
if (C is GroupBox)
foreach (Control T in C.Controls) // loop GroupBox controls
...
答案 3 :(得分: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; }
}