1

ページに 3 つの 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 を自動的に選択することです ( Little JB の問題を参照)。実際には、System.Web.UI.LiteralControl (WebControl.Controls には実際には LiteralControls が含まれています) から System.Web.UI.WebControls.WebControl にキャストできないため、InvalidCastException を受け取ります。

このアプローチを何らかの方法で変更して、実用的なソリューションを受け取ることは可能ですか? ありがとうございました!

4

3 に答える 3

5

OfType

from control in changed_control
  .Parent
  .Controls
  .OfType<WebControl>()
于 2008-10-07T13:48:01.743 に答える
1

OfType メソッドを使用して、特定のタイプのコントロールのみを返すことができるはずです。

例えば

var nextcontrols = from WebControl control in     
                   Changed_control.Parent.Controls.OfType<TextBox>()... etc
于 2008-10-07T13:46:22.057 に答える
0

問題は、LiteralControlがWebControlから継承しないことです。ただし、フォーカスを合わせることができないため、選択しなくてもかまいません。LINQステートメントで、WebControlの別の条件チェックを追加します。だからあなたのwhereラインはあるべきですwhere control.TabIndex > changed_control.TabIndex && control is WebControl

于 2008-10-07T13:49:04.080 に答える