Приведение элемента управления TextBox из запроса linq - PullRequest
1 голос
/ 03 марта 2012

Я пытаюсь получить 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'.

Что мне здесь не хватает?

Edit:

Еще несколько попыток с сообщениями об ошибках:

Использование .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

1 Ответ

2 голосов
/ 03 марта 2012

Обычно вы используете «Где» так:

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

, где textBoxes - IEnumerable<TextBox>.

Но если вы знаете, что вам нужно только одно текстовое поле с таким именем

tbx.SingleOrDefault(x => x.Name == "tbxLink");

, который будет возвращать ноль (точнее default(TextBox)), если текстовое поле с таким именем отсутствует,

или, альтернативно,

tbx.Single(x => x.Name == "tbxLink");

, которое вызывает исключениеесли текстовое поле с таким именем не существует.

Если имеется несколько текстовых полей с одинаковым именем, вы можете использовать

tbx.FirstOrDefault(x => x.Name == "tbxLink");

или

tbx.First(x => x.Name == "tbxLink");

Asпример выполнения этого кода в 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);
    }
...