我在页面上有三个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();
}

此代码的含义是在页面回发后自动选择带有下一个TabIndex的TextBox(参见小JB的问题)。实际上我收到InvalidCastException,因为无法从System.Web.UI.LiteralControl(WebControl.Controls包含实际的LiteralControls)转换为System.Web.UI.WebControls.WebControl。

我感兴趣的是有可能以某种方式修改此方法以获得工作解决方案吗?谢谢!

有帮助吗?

解决方案

OfType

from control in changed_control
  .Parent
  .Controls
  .OfType<WebControl>()

其他提示

您应该能够使用OfType方法,仅返回给定类型的控件。

e.g。

var nextcontrols = from WebControl control in     
                   Changed_control.Parent.Controls.OfType<TextBox>()... etc

问题是LiteralControl不会从WebControl继承。虽然它不能有焦点,所以可以不选择它们。在LINQ语句中,添加另一个检查WebControl的条件。所以你的where行应该是,其中control.TabIndex&gt; changed_control.TabIndex&amp;&amp;控制是WebControl

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top