从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
使用FirstOrDefault
或SingleOrDefault
使tbx变量null
您通常会使用这样的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);
}