我正在尝试从一个只包含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
答案 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);
}