是否有LINQy方法来设置所有ReadOnly控件' TabStop为false?

时间:2015-01-21 00:41:41

标签: c# linq controls readonly tabstop

我正在使用以下代码将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的第一个参数'可以找到(你错过了使用指令或汇编引用吗?)

- 在使用 SelectMany 的两个实例中(并且它似乎不可解析);并且,在“收益率返回c”行:

当前上下文中不存在名称”c“

更新2

对于我的简单场景(控件中没有容器/控件),这可以正常工作

foreach (Control control in this.Controls)
{
    var txtbx = control as TextBox;
    if (txtbx != null)
    {
        txtbx.TabStop = (!txtbx.ReadOnly);
    }
}

3 个答案:

答案 0 :(得分:3)

要使你的例子变得简洁:

foreach (var control in Controls.OfType<TextBox>().Where(c => c.ReadOnly)
{
    control.TabStop = false;
}

但是,您的示例不会处理所有控件,因为Control可以包含其他控件。你需要一个递归下降算法。

IEnumerable<Control> Walk(Control control)
{
   yield return control;
   foreach (var child in control.Controls.SelectMany(c=> Walk(c)))
   {
      yield return c;
   }
}

var q = Controls
  .SelectMany(c => Walk(c))
  .OfType<TextBox>().
  .Where(c => c.ReadOnly);
foreach (var control in q)
{
    control.TabStop = false;
}

答案 1 :(得分:1)

foreach (TextBox control in this.Controls.OfType<TextBox>())

答案 2 :(得分:0)

不是性能最好的,也不是最易读的代码,但是这里你可以将它作为一个单行代码来实现:

this.Controls.OfType<TextBox>().ToList().ForEach(t => t.TabStop = !t.ReadOnly);

......只是为了证明你可以。