【发布时间】:2015-01-24 04:15:47
【问题描述】:
我正在使用以下代码将 ReadOnly 属性为 true 的所有控件的 TabStop 属性设置为 false:
foreach (Control control in this.Controls)
{
if (control is TextBox)
{
//if (((TextBox)control).ReadOnly)
//{
// control.TabStop = false;
//}
control.TabStop = (!((TextBox)control).ReadOnly);
}
}
...但我认为可能有一种更“现代”(优雅/花哨)的方式来做到这一点,可能是使用 LINQ。
更新
好的,所以我认为,根据答案,这会起作用:
private void FrmDelivery_Load(object sender, EventArgs e)
{
var q = Controls.SelectMany(c => Walk(c)).OfType<TextBox>().Where(c
=> c.ReadOnly);
foreach (var control in q)
{
control.TabStop = false;
}
}
IEnumerable<Control> Walk(Control control)
{
yield return control;
foreach (var child in control.Controls.SelectMany(c=> Walk(c)))
{
yield return c;
}
}
...但我明白了:
"'System.Windows.Forms.Control.ControlCollection' 不包含 'SelectMany' 的定义,并且没有扩展方法 'SelectMany' 接受类型为 'System.Windows.Forms.Control.ControlCollection 的第一个参数' 可以找到(您是否缺少 using 指令或程序集引用?)"
-在使用 SelectMany 的两种情况下(并且它似乎无法解析);并且,在“yield return c”行:
"名称'c'在当前上下文中不存在"
更新 2
对于我的简单场景(控件中没有容器/控件),这是可行的
foreach (Control control in this.Controls)
{
var txtbx = control as TextBox;
if (txtbx != null)
{
txtbx.TabStop = (!txtbx.ReadOnly);
}
}
【问题讨论】:
-
Winforms (Windows CE)
标签: c# linq controls readonly tabstop