从linq查询中转换TextBox控件

时间:2012-03-03 11:12:18

标签: c# wpf linq collections controls

我正在尝试从一个只包含TextBoxes的集合中获取TextBox控件,如下所示:

IEnumerable<TextBox> tbx = this.grd.Children.OfType<TextBox>();

然后我试图获取名为“tbxLink”的TextBox控件,如下所示:

TextBox txtBox = (TextBox)tbx.Select(x => x.Name == "tbxLink");

但它在运行时给我这个错误信息:

Unable to cast object of type 'WhereSelectEnumerableIterator`2[System.Windows.Controls.TextBox,System.Boolean]' to type 'System.Windows.Controls.TextBox'.

我在这里缺少什么?

编辑:

还有一些尝试使用更多错误消息:

使用.Where

Unable to cast object of type 'WhereEnumerableIterator`1[System.Windows.Controls.TextBox]' to type 'System.Windows.Controls.TextBox'.

使用.Single

Sequence contains no matching element

使用.First

Sequence contains no matching element

使用FirstOrDefaultSingleOrDefault生成tbx变量null

1 个答案:

答案 0 :(得分:2)

你通常会使用这样的地方:

 IEnumerable<TextBox> textBoxes = tbx.Where(x=>x.Name == "tbxLink");

其中textBoxes为IEnumerable<TextBox>

但是如果你知道只需要一个带有该名称的文本框

tbx.SingleOrDefault(x => x.Name == "tbxLink");
如果没有该名称的文本框,

将返回null(更准确地说是default(TextBox)),

或者

tbx.Single(x => x.Name == "tbxLink");

如果不存在该名称的文本框,则抛出异常。

如果有多个具有相同名称的文本框,您可能需要使用

tbx.FirstOrDefault(x => x.Name == "tbxLink");

tbx.First(x => x.Name == "tbxLink");

例如,在LINQPad中运行此代码可以按预期工作:

void Main()
{
     IEnumerable<TextBox> items = new List<TextBox>{
        new TextBox{ Name = "One" },
        new TextBox{ Name = "Two" },
        new TextBox{ Name = "Three" },
        new TextBox{ Name = "Four" },
    };

    items.Single (i => i.Name == "One").Dump();
}

class TextBox
{
    public string Name {get;set;}
}

我使用WPF复制了这个,例如

    private void Button_Click_1(object sender, System.Windows.RoutedEventArgs e)
    {
        IEnumerable<TextBox> textBoxes = grid.Children.OfType<TextBox>();

        var textBox = textBoxes.Single(tb => tb.Name == "one");

        Debug.WriteLine(textBox.Name);
    }