Запрос LINQ к WebControl.Элементы управления
-
05-07-2019 - |
Вопрос
У меня есть три элемента управления текстовым полем на странице
<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();
}
Смысл этого кода заключается в автоматическом выборе текстового поля со следующим TabIndex после обратной публикации страницы (см. Проблема Маленького Джей Би).На самом деле я получаю InvalidCastException, потому что невозможно выполнить приведение из System.Web.UI.LiteralControl (WebControl.Элементы управления фактически содержат LiteralControls) в System.Web.UI.WebControls.WebControl.
Меня интересует, можно ли как-то изменить этот подход, чтобы получить рабочее решение?Спасибо!
Решение
from control in changed_control
.Parent
.Controls
.OfType<WebControl>()
Другие советы
Вы должны иметь возможность использовать метод OfType, чтобы возвращать элементы управления только заданного типа.
например ,
var nextcontrols = from WebControl control in
Changed_control.Parent.Controls.OfType<TextBox>()... etc
Проблема в том, что LiteralControl не наследуется от WebControl. У него не может быть фокуса, поэтому можно не выбирать их. В своем операторе LINQ добавьте еще одну проверку условий для WebControl. Так что ваша строка where должна быть , где control.TabIndex > change_control.TabIndex & amp; & amp; Элемент управления WebControl
.