LINQ-запрос к WebControl.Controls - PullRequest
1 голос
/ 07 октября 2008

У меня есть три элемента управления TextBox на странице

<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True"
        OnTextChanged="TextBox_TextChanged" TabIndex="1">
<asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True"
        OnTextChanged="TextBox_TextChanged" TabIndex="2">
<asp:TextBox ID="TextBox3" runat="server" AutoPostBack="True"
        OnTextChanged="TextBox_TextChanged" TabIndex="3">

и обработчик событий

protected void TextBox_TextChanged(object sender, EventArgs e)
{
    WebControl changed_control = (WebControl)sender;

    var next_controls = from WebControl control in changed_control.Parent.Controls
                        where control.TabIndex > changed_control.TabIndex
                        orderby control.TabIndex
                        select control;

    next_controls.DefaultIfEmpty(changed_control).First().Focus();
}

Смысл этого кода в том, чтобы автоматически выбирать TextBox со следующим TabIndex после пост-поста назад (см. Проблема Little JB ). На самом деле я получаю InvalidCastException, потому что невозможно привести из System.Web.UI.LiteralControl (фактически, WebControl.Controls содержит LiteralControls) к System.Web.UI.WebControls.WebControl.

Меня интересует, можно ли как-то изменить этот подход, чтобы получить рабочее решение? Спасибо!

Ответы [ 3 ]

5 голосов
/ 07 октября 2008

OfType

from control in changed_control
  .Parent
  .Controls
  .OfType<WebControl>()
1 голос
/ 07 октября 2008

Вы должны иметь возможность использовать метод OfType, чтобы возвращать только элементы управления данного типа.

например.

var nextcontrols = from WebControl control in     
                   Changed_control.Parent.Controls.OfType<TextBox>()... etc
0 голосов
/ 07 октября 2008

Проблема в том, что LiteralControl не наследуется от WebControl. У него не может быть фокуса, поэтому можно не выбирать их. В своем операторе LINQ добавьте еще одну проверку условий для WebControl. Так что ваша строка где должна быть where control.TabIndex > changed_control.TabIndex && control is WebControl.

...