从linq查询强制转换TextBox控件

本文关键字:转换 TextBox 控件 linq 查询 | 更新日期: 2023-09-27 18:26:36

我正试图从一个只包含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

从linq查询强制转换TextBox控件

您通常会使用这样的Where:

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