【问题标题】:Is there a LINQy way to set all ReadOnly controls' TabStop to false?有没有一种 LINQy 方法可以将所有 ReadOnly 控件的 TabStop 设置为 false?
【发布时间】: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


【解决方案1】:

为了 linqify 你的例子:

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;
}

【讨论】:

  • 在这种情况下,没有容器,但是是的,这是一个很好的观点...IsReadOnly 似乎对我不可用,虽然...
  • 我的错。将IsReadOnly 更改为ReadOnly
【解决方案2】:
foreach (TextBox control in this.Controls.OfType<TextBox>())

【讨论】:

    【解决方案3】:

    不是最高性能,也不是最易读的代码,但以下是您可以作为单行代码的方法:

    this.Controls.OfType&lt;TextBox&gt;().ToList().ForEach(t =&gt; t.TabStop = !t.ReadOnly);

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

    【讨论】:

      猜你喜欢
      • 2013-05-15
      • 2012-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2021-08-14
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多