【发布时间】:2015-07-28 17:21:25
【问题描述】:
我有一个 Windows 表单,它只是为了从用户那里获取输入,出于所有意图和目的,它只是一个标签和一个相应的输入框(文本框、复选框、掩码文本框等)。
我以编程方式将所有输入字段置于 TabIndex 顺序中,该顺序最适合以适合其位置的方式循环浏览它们(按标签向下输入每一列,然后到下一列的顶部)。
我正在为其构建此项目的人已规定,每次只允许每个文本框可用一个,因为前一个已填写。这是一种未经验证的粗略方式,但本质上是这样的......
if (String.IsNullOrEmpty(textbox1.Text))
{
textbox2.Enabled = true
}
所以在这个例子中这对两个文本框来说很好,但是表单上有 28 个不同的输入,所以一系列荒谬的 if 语句只能是最后的手段。
我的想法是将所有输入放在一个列表中,理想情况下与它们的 TabIndexes 的顺序相同。我尝试使用 foreach 循环来做到这一点...
List<Control> inputsList = new List<Control>();
public void initialiseControls()
{
//control position to insert control into list at specified index
int cntrlpos = 0;
//for every control in form
foreach (Control cntrl in this.Controls)
{
//not counting labels (not input fields)
if (!(cntrl is Label))
{
//set list position to equal control's TabIndex
cntrlpos = cntrl.TabIndex;
//insert the control into the list at the position reflecting TabIndex
inputsList.Insert(cntrlpos, cntrl); //<---- Error Occurs
//ASK TEXTBOX TO OUTPUT LIST POSITION AS TEST
//foreach (var txtbx in this.Controls.OfType<TextBox>())
//{
// txtbx.Text = Convert.ToString(cntrlpos);
//}
}
}
一旦调用该函数,就会抛出一个异常,指出“索引必须在列表的范围内”。 当我在代码中设置断点时,它显示 cntrlpos 等于 29,这比表单上的 28 个输入控件总数还要多。
我不知道从这里去哪里,如果有人可以就上面的代码提供一些建议,以正确的顺序将控件放入列表中(或者向我指出另一种方法的方向来做这样的事情),那么我将不胜感激。
谢谢, 标记
【问题讨论】: