2012-03-03 41 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