首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >foreach (Frm.Controls中的controls )它控制控件的顺序

foreach (Frm.Controls中的controls )它控制控件的顺序
EN

Stack Overflow用户
提问于 2010-12-24 19:21:40
回答 7查看 15.1K关注 0票数 2

在将TextBox控件添加到窗体的控件属性中的顺序方面,我遇到了一个特殊的问题。

目前,我有这样的功能:

代码语言:javascript
复制
 public static bool IsValidate(System.Windows.Forms.Form Frm)
 {
     foreach (Control ctrl in Frm.Controls)                  
         if (ctrl is TextBox)
         //  if (((TextBox)ctrl).AccessibleDescription == "Valid" && ((TextBox)ctrl).Text == string.Empty)
         if (((TextBox)ctrl).AccessibleDescription == "Valid" &&  ((TextBox)ctrl).Text.Trim()== "")
         {
             MessageBox.Show(((TextBox)ctrl).AccessibleName + " Can't be Blank", Program.companyName, MessageBoxButtons.OK, MessageBoxIcon.Stop);                         
             ((TextBox)ctrl).Focus();
              return false;
         }
         return true;
}

但是它会随机地遍历文本框,即使我已经设置了它们的标签索引。

因此,我再次开发了相同的表单,并按顺序创建了文本框。但是,当我将表单传递给这个函数时,它仍然会随机地遍历文本框。

我想知道控件是否有任何属性可以让我管理它们的流。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-12-24 19:34:36

手动对控件排序要比在Controls集合中管理它们的顺序容易得多。示例(按TabOrder排序):

代码语言:javascript
复制
    private static int CompareTabIndex(TextBox c1, TextBox c2)
    {
        return c1.TabIndex.CompareTo(c2.TabIndex);
    }

    public static bool IsValid(Form form)
    {
        List<TextBox> textBoxes = new List<TextBox>();
        foreach(Control ctl in form.Controls)
        {
            TextBox textBox = ctl as TextBox;
            if(textBox != null) textBoxes.Add(textBox);
        }
        textBoxes.Sort(new Comparison<TextBox>(CompareTabIndex));
        foreach(TextBox textBox in textBoxes)
        {
            if(textBox.AccessibleDescription == "Valid" && textBox.Text.Trim() == "")
            {
                MessageBox.Show(textBox.AccessibleName + " Can't be Blank",
                    Program.companyName, MessageBoxButtons.OK, MessageBoxIcon.Stop);
                textBox.Focus();
                return false;
            }
        }
        return true;
    }
票数 4
EN

Stack Overflow用户

发布于 2012-09-15 19:43:12

你可以很容易地做到这点。请使用以下语法并根据表单中的tabindex对控件进行排序

代码语言:javascript
复制
foreach (Control control in this.Controls.Cast<Control>()
                                         .OrderBy(c => c.TabIndex))
{
}
票数 15
EN

Stack Overflow用户

发布于 2010-12-24 19:29:34

它真的是“随机”遍历控件吗?(这意味着它是不确定的,并且顺序可能每次都会改变。)或者它每次都以相同的顺序迭代控件,但不是您期望的顺序?鉴于C#语言规范explicitly states the ordering of foreach (参见第一个答案),我怀疑是后者。

Tab键顺序当然不会影响控件的顺序。这只是为了UI目的。控件在后备存储区中作为数组元素的实际顺序更可能由它们在生成窗体时的创建顺序控制。

您能否详细说明一下最后一部分,即您再次开发表单“并按顺序获取文本框”?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4526025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档