2012-03-03 77 views
1

我想从其中只包含文本框如下集合的TextBox控制:演员TextBox控件

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

然后我试图让具有名称TextBox控制“tbxLink” 如下:

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

回答

2

您通常会使用在哪里这样的:

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

其中的文本框为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); 
    } 
+0

我忘了提及我也使用了'Where'子句,但是这也失败了。有多个文本框,但名称是相同的。那么SingleOrDefault也会如此工作,或者只有一个文本框? – Yustme 2012-03-03 11:18:22

+0

@Yustme:如果有多个同名的文本框,为什么期望能够分配给一个'TextBox'变量? – 2012-03-03 11:19:36

+0

那你要不要tbx.First(x => x.Name ==“tbxLink”)? – Phil 2012-03-03 11:20:55