2012-03-01 5 views
6

私はRepeaterの中にAutoPostBackを持つDropDownListを配置しています。
(リストアイテムがリピータのItemDataBoundに読み込まれます)Repeater内のDropDownList:SelectedIndexChangeを処理してDataItemを取得する方法は?

<asp:Repeater ID="rptWishlist" OnItemCommand="rptWishlist_ItemCommand" onItemDataBound="rptWishlist_ItemDataBound" runat="server"> 
    <ItemTemplate> 
    ... 
    <asp:DropDownList ID="ddlSize" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlSize_SelectedIndexChanged" /> 
    ... 
バックまず、この関数はさえポストに解雇されなかった
  1. protected void ddlSize_SelectedIndexChanged(object sender, EventArgs e)
    {
    //This function is never called
    }

  2. DataItemを取得したらどうしたらいいですか?

アム私はこれは間違った方法やって?

ありがとうございます。

protected virtual void RepeaterItemCreated(object sender, RepeaterItemEventArgs e) 
    { 
     DropDownList MyList = (DropDownList)e.Item.FindControl("ddlSize"); 
     MyList.SelectedIndexChanged += ddlSize_SelectedIndexChanged; 
    } 

そして、あなたのaspxファイルでは、あなたのリピータのマークアップにこれを追加します:、ポストバックのためのドロップダウンリストを登録し、次のコードを追加するには

答えて

12

OnItemCreated="RepeaterItemCreated" 

次に、あなたのddlSize_SelectedIndexChanged機能では、次のように親コントロールにアクセスできます:

DropDownList d = (DropDownList)sender; 
    (RepeaterItem) d.Parent... 

ps。

+0

おかげで多くのことをお試しください!次に、DropDownListが属するDataItemを取得するにはどうすればよいですか? – Aximili

+1

DataItemは、ItemCreatedメソッドおよびItemDataBoundメソッドでのみ使用できます。私はあなたがする必要があるだろうと思うリピーターには、検索するアイテムを参照するために使用できるいくつかのコントロールを追加すると思います。 – jmaglio

+0

なぜ 'OnSelectedIndexChanged =" ddlSize_SelectedIndexChanged "'? – toddmo

1

あなただけOnSelectedIndexChangedを発射する場合、これはそれがどのように見えるべきかです:

Page.aspx - ソース

<FooterTemplate> 
    <asp:DropDownList ID="ddlOptions" 
      runat="server" 
      AutoPostBack="true" 
      onselectedindexchanged="ddlOptions_SelectedIndexChanged"> 
     <asp:ListItem>Option1</asp:ListItem> 
     <asp:ListItem>Option2</asp:ListItem> 
    </asp:DropDownList> 
</FooterTemplate> 

Page.aspx.cs - コードビハインド

protected void ddlOptions_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //Event Code here. 
    } 

それだけです。あなたのイベントは今呼び出されます。

2

投稿したコードの部分に問題はありません。

IsPostBackがtrueで、PageLoadのときにリピータでDataBind()を呼び出しますか? もしそうなら、あなたはあなたが値またはのHiddenFieldで、たとえば、IDを格納する必要があり

は、一般のとおり(リストビューは、この目的のためにDataKeyを持つ)ポストバック処理中に

を特定DataItemsをロードするために、あなたのDDL

上のSelectedIndexChangedを失うことになりますガイドライン:

  • それはPreRenderイベント中にDataBindを()を呼び出すことが多い方が良いです
  • 基になるデータが変更されていない場合は、ポストバック中にDataBind()を呼び出すべきではありません
  • あなたは上記の2点を行う場合、あなたは でDataItemsを使用することはできませんがitem_created(あなたDataItemsは、あなたが呼び出すときにのみ使用可能になりますよう にDataBind())ここで

    protected void Page_Load(object sender, EventArgs e) 
    { 
        this.PreRender += new EventHandler(test_PreRender); 
    } 
    
    void test_PreRender(object sender, EventArgs e) 
    { 
        if (!IsPostBack) 
        { 
         rptWishlist.DataSource = new int[] { 1, 2, 3, 4 }; 
         rptWishlist.DataBind(); 
        } 
    } 
    
    protected void rptWishlist_ItemCommand(object sender, RepeaterCommandEventArgs e) 
    { 
        //Command Code Here 
    } 
    
    protected void rptWishlist_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
        var i = (int) e.Item.DataItem; 
        var ddl = (DropDownList)e.Item.FindControl("ddlSize"); 
        for(int j=1; j<=i;j++) 
        { 
         ddl.Items.Add(new ListItem(){Text = j.ToString()}); 
    
        } 
    } 
    
    protected void ddlSize_SelectedIndexChanged(object sender, EventArgs e) 
    { 
        Response.Write("changed"); 
    } 
    
1

答え良いですが、重要なチェックを欠いています。なぜオブジェクト・リファレンスがオブジェクト・エラーのインスタンスに設定されていないのか不思議であれば、リピーターはデータ項目の前にHEADERを最初に作成することに注意することが重要です。

このチェックを実行します。

protected void rptProjects_ItemCreated(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
      ((DropDownList)e.Item.FindControl("yourcontrol")).SelectedIndexChanged += ddlAction_SelectedIndexChanged; 
    } 
} 
-1

この

DropDownList drp = sender as DropDownList; 
    int RepeaterItemIndex = ((RepeaterItem)drp.NamingContainer).ItemIndex; 
関連する問題