2012-03-01 10 views
6

मैं एक रिपेटर के अंदर ऑटोपोस्टबैक के साथ ड्रॉपडाउनलिस्ट डाल रहा हूं।
(ListItems पुनरावर्तक के ItemDataBound पर भर जाती है)रिपेटर के अंदर ड्रॉपडाउनलिस्ट: चयनित इंडेक्स चेंज को कैसे संभालें और डेटाइटम प्राप्त करें?

<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. पर गोली चलाई नहीं किया गया था
  3. मैं इसे काम करने के बाद डेटाइटम कैसे प्राप्त करूं?

क्या मैं यह गलत तरीका कर रहा हूं?

अग्रिम धन्यवाद।

उत्तर

12

पोस्टबैक के लिए dropdownlist पंजीकृत करने के लिए निम्न कोड जोड़ें:

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

और अपने aspx फ़ाइल में, अपने पुनरावर्तक मार्कअप से जोड़ें:

OnItemCreated="RepeaterItemCreated" 

फिर, अपने ddlSize_SelectedIndexChanged समारोह में, आप इस तरह के अभिभावक नियंत्रण तक पहुंच सकते हैं:

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

आशा है कि यह हेल ps।

+0

धन्यवाद एक बहुत कोशिश करो! तो मैं DropDownList DataItem कैसे प्राप्त करूं? – Aximili

+1

डेटाइटम केवल आइटमक्रेटेड और आइटमडेटाबाउंड विधियों में उपलब्ध है। मुझे लगता है कि आपको क्या करना होगा पुनरावर्तक को कुछ नियंत्रण जोड़ें जिसे आप उस आइटम को संदर्भित करने के लिए उपयोग कर सकते हैं जिसे आप पुनर्प्राप्त करना चाहते हैं। – jmaglio

+0

क्यों नहीं 'चुना गया इंडेक्स चेंज = "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

मुझे आपके द्वारा पोस्ट किए गए कोड के हिस्से में कोई समस्या नहीं है।

क्या आप अपने पुनरावर्तक पर DataBind() को कॉल करते हैं जब IsPostBack सत्य है, और पेजलोड के दौरान? यदि हां, तो आप

आप मान या HiddenField में उदाहरण के लिए आईडी संगृहीत करना चाहिए, पोस्टबैक प्रसंस्करण के दौरान विशिष्ट DataItems लोड करने के लिए (ListView इस उद्देश्य के लिए DataKey है)

एक सामान्य रूप में आप DDLs

पर SelectedIndexChanged खो देंगे दिशानिर्देश:

  • यह पूर्वप्रस्तुत दौरान DataBind() कॉल करने के लिए अक्सर बेहतर है
  • आप पोस्टबैक के दौरान DataBind() नहीं बुलाना चाहिए अगर अंतर्निहित डेटा नहीं बदला है
  • अगर आप दो अंक ऊपर करते हैं, आप में 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

जवाब यहाँ अच्छा है लेकिन महत्वपूर्ण चेक अनुपलब्ध है। यदि आप सोच रहे हैं कि आप ऑब्जेक्ट संदर्भ क्यों प्राप्त कर रहे हैं, किसी ऑब्जेक्ट त्रुटियों के उदाहरण पर सेट नहीं है, तो यह ध्यान रखना महत्वपूर्ण है कि पुनरावर्तक किसी भी डेटा आइटम से पहले अपना हेडर बना देगा।

इस चेक करें:

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; 
संबंधित मुद्दे