2009-08-31 7 views
3

おそらくこれは何か非常に簡単ですが、これまでのところ、私は一日中働いて何かを持っています。ASP.Net 2.0リピータコントロールの現在のインデックスを取得

私はテーブルでいっぱいのリピーターを持っています。リピータの各行には一連のコントロールがあります。その中で最も重要なのは、AutoPostback = trueのドロップダウンリストです。

このddlは、ユーザーが選択したインデックスを変更したときに、ddl内のコントロールを表示/非表示にするときにポストバックする必要があります。

問題は、ユーザーがddlで選択したインデックスとコントロールポストバックをサーバー側で変更すると、ポストバックを行ったddlを含む行のインデックスを取得できないという問題です。

十分にクリアで、誰かが私をここで助けてくれることを願っています。

ありがとうございます!

EDIT: 多分これが十分に明確ではなかったものです:私はリピーターにItemTemplateに内部ID =「ddlSomething」でコントロールを配置し、私がデータソースに5行を持っているとき、私は意志リピータの5行に同じIDを持つ5 ddlがあります(クライアント側では、 "ctl01 $ ddlSomething"、 "ctl02 $ ddlSomething"のようになります)。 私の問題は、ddlポストバックRequest.Form変数を見るだけで、これらの5つのうちどれが(例えば)ddlがポストバックを行ったものか分かりません。 "ddlSomething"というコントロールがそれを作ったことがわかります。

答えて

5

は試してみてくださいので

<asp:DropDownList runat="server" id="myDDL" OnSelectedIndexChanged="myDDL_Changed" /> 

//fired when the DDL selected index changes 
void myDDL_Changed(object sender, EventArgs e) 
{ 
    //sender is the ddl 
    DropDownList theDropDown = sender as DropDownList; 
    int repeaterItemIndex = ((RepeaterItem)theDropDown.NamingContainer).ItemIndex; 
} 
+0

私はそれを手に入れません...どのコンテキストでこれが起こりますか?すべてのddlはサーバ側で同じIDを持っています...どうすればいいですか?私がそれについての情報を得るために管理する唯一の方法は、Request.Form変数を使用するPage_loadです。 – Sebastian

+0

@セバスチャン私の改訂版の回答を参照してください。 –

+0

ありがとうRex M、これは最高のことだよ! – Sebastian

1

FormViewではおそらくそれは担当者で動作することができます食べる人にも:DDL HTMLマークアップで

DDL要素にidの属性を追加します。ポストバックで

MyID='<%# Eval("MyID") %>' 

その要素のためにそのIDをつかむ:

int intID = Convert.ToInt32((sender as DropDownList).Attributes["MyID"]); 
..... 

EDIT: employee_nameテーブル、employee_typeテーブル、employee_idテーブルを持っている場合 従業員タイプがフルタイム、パートタイムなどのDLLである従業員名と従業員タイプを出力するものがあります。 この宣言を追加することができます

MyID='<%# Eval("employee_id") %>' 

とDDLポストバック中:

int employeeID = Convert.ToInt32((sender as DropDownList).Attributes["MyID"]); 
+0

"MyID"はどこに定義されていますか? –

+0

MyIDは独自のカスタムHTML属性です。マークアップのどこにでも定義されていません。このソリューションは機能しますが、認識できない属性の結果としてHTML検証エラーが発生することに注意してください。しかし、騒がしいものはありません。 –

+0

私は、定義されているDataItemの "MyID"はどこですか? MyIDは、それをバインドするためにEval()のDataItem上のメンバでなければなりません。 –

0

リピータ自体は、選択されたコントロールを伝えることはできませんDDLのマークアップにY指定したアイテムテンプレートにはコントロールの組み合わせを含めることができ、「選択済み」として指定する方法がない可能性があります。

リピータリストの内部コントロールをチェックする必要があります。テーブルを作成するので、リピータの選択されたインデックスをチェックするのではなく、テーブル自体の選択されたインデックスをチェックすることができます。

それ以外の場合は、コントロールを繰り返して、どれが選択されているかを確認します。 このようなもの、たとえば、あなたはそれぞれの行を反復処理することができ、送信DDLを探します。

for(...) 
    { 
     if(containingElement.Controls.Find(sender.ID)) 
     { 
     // You found it! 
     } 
     // otherwise keep looking... 
    } 
1

私はしてもしなくてもよい、ここで的外れセバスチャンかもしれないが、私はあなたがバブルANにしようとしていると考えていますイベント。

<asp:Repeater id="myRepeater" runat="server"> 
    <ItemTemplate> 
     <asp:DropDownList ID="ddlSomething" AutoPostBack="true" runat="server"></asp:DropDownList> 
    </ItemTemplate> 
</asp:Repeater> 

がリピータ内からイベントをキャッチする、あなたは、すなわち「OnItemCommand」属性を使用することができます。

はたとえば、あなたの説明から私はあなたのような何かをやっている印象の下です:

の後ろにあなたのコードで
<asp:Repeater id="myRepeater" OnItemCommand="SomeEvent_ItemCommand" runat="server"> 
     <ItemTemplate> 
      <asp:DropDownList ID="ddlSomething" AutoPostBack="true" runat="server"></asp:DropDownList> 
     </ItemTemplate> 
    </asp:Repeater> 

、あなたは今、次の操作を行うことができます:

protected void SomeEvent_ItemCommand(object sender, RepeaterCommandEventArgs e) 
     { 
      if (e.CommandSource.GetType() == typeof(DropDownList)) 
      { 
       DropDownList ddlSomething = (DropDownList)e.Item.FindControl("ddlSomething"); 

       //Now you can access your list that fired the event 
       SomeStaticClass.Update(ddlSomething.SelectedIndex); 
      } 
     } 

私はここに間違った道を歩いていないことを望むが、それはあなたが撃っているものの何かだと思う。

EDIT:

がここに小さなコメントを追加するには、「e.Itemは」上から発射されたあなたのイベントを持っている行があります。したがって、ドロップダウンリストだけでなく、その行の他のコントロールにフルアクセスできます。

Dim ddl = DirectCast(sender, DropDownList) 
Dim lbl = DirectCast(DirectCast(ddl.NamingContainer,RepeaterItem).FindControl("Label1"),Label) 

よろしく:

+0

これは良い答えだとAlexis、ありがとう。私は後でそれを試してみますが、まずこれを出荷する必要があります! :p – Sebastian

0

あなたのリピーターに入れlableをし、それをバインドし、その後、あなたのDropDownListのあなたのSelectedIndexChangedには、次のように値を取得することができます。

関連する問題