C# - 以TabIndex顺序将所有输入控件添加到List <controls>

时间:2015-07-28 17:21:26

标签: c# list controls

我有一个Windows窗体,只是存在来从用户那里获取输入,因为它只是一个标签和一个相应的输入框(文本框,复选框,masket文本框等)。

我已经以编程方式将所有输入字段放在TabIndex顺序中,该顺序最适合以适合其位置的方式循环显示它们(在每列输入中向下,然后在下一列的顶部)。

我正在构建此项目的人已经规定,只有每个文本框一次可用一个,因为前一个已填写完毕。这是一种粗略的方式,没有验证,但基本上是这样的......

if (String.IsNullOrEmpty(textbox1.Text))
{
    textbox2.Enabled = true
}

所以这个例子中的两个文本框很好,但是表单上有28个不同的输入,所以一系列荒谬的if语句只是最后的手段。

我的想法是将所有输入放在List中,理想情况下与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个总输入控件。

我不知道从哪里开始,如果有人可以就上面的代码提供一些建议,以正确的顺序将控件放入列表中(或者指向另一种方法的方向来做这样的事情),那我真的很感激。

谢谢, 标记

2 个答案:

答案 0 :(得分:2)

要制作列表,请尝试以下操作:

List<Control> inputList =
    (from Control c in getAllControls(this)
     where c.TabStop
     orderby c.TabIndex
     select c).ToList();

在表单类的其他位置定义方法getAllControls

IEnumerable<Control> getAllControls(Control parent)
{
    foreach (Control control in parent.Controls)
    {
        yield return control;
        foreach (Control descendant in getAllControls(control))
            yield return descendant;
    }
}

(从Recursive control search with Linq略微采取和修改)

这样可以使您获得嵌套控件(例如面板或组框中的控件)。

你不能只使用TabIndex作为列表的索引,因为即使像标签这样的东西也会有标签索引,这会使你的索引陷入困境。

答案 1 :(得分:0)

我认为你复杂了......

只需使用Control.GetNextControl

  

以子项的Tab键顺序向前或向后检索下一个控件   控件。

例如,只有TextBoxes:

    private void textBoxes_TextChanged(object sender, EventArgs e)
    {
        Control ctl = (Control)sender;
        if (!String.IsNullOrEmpty(ctl.Text))
        {
            Control next = this.GetNextControl(ctl, true);
            if (next != null)
            { 
                next.Enabled = true;
            }
        }
    }

显然,您可能需要对不同处理程序中的其他类型的控件进行稍微复杂的检查,但您仍然只需抓取下一个控件以启用GetNextControl()。