在将TextBox控件添加到窗体的控件属性中的顺序方面,我遇到了一个特殊的问题。
目前,我有这样的功能:
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;
}但是它会随机地遍历文本框,即使我已经设置了它们的标签索引。
因此,我再次开发了相同的表单,并按顺序创建了文本框。但是,当我将表单传递给这个函数时,它仍然会随机地遍历文本框。
我想知道控件是否有任何属性可以让我管理它们的流。
发布于 2010-12-24 19:34:36
手动对控件排序要比在Controls集合中管理它们的顺序容易得多。示例(按TabOrder排序):
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;
}发布于 2012-09-15 19:43:12
你可以很容易地做到这点。请使用以下语法并根据表单中的tabindex对控件进行排序
foreach (Control control in this.Controls.Cast<Control>()
.OrderBy(c => c.TabIndex))
{
}发布于 2010-12-24 19:29:34
它真的是“随机”遍历控件吗?(这意味着它是不确定的,并且顺序可能每次都会改变。)或者它每次都以相同的顺序迭代控件,但不是您期望的顺序?鉴于C#语言规范explicitly states the ordering of foreach (参见第一个答案),我怀疑是后者。
Tab键顺序当然不会影响控件的顺序。这只是为了UI目的。控件在后备存储区中作为数组元素的实际顺序更可能由它们在生成窗体时的创建顺序控制。
您能否详细说明一下最后一部分,即您再次开发表单“并按顺序获取文本框”?
https://stackoverflow.com/questions/4526025
复制相似问题