質問

ページに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を受け取ります。

このアプローチを何らかの方法で修正して、実用的なソリューションを受け取ることができるかどうかに興味がありますか?ありがとう!

役に立ちましたか?

解決

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行は where control.TabIndex&gt;になります。 changed_control.TabIndex&amp;&amp;コントロールはWebControl です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top