2010-06-09 11 views
5

उपयोगकर्ता नियंत्रण में, मुझे एक अपडेटपेनल के अंदर एक दोहराया गया है (जो आईडी मॉडलपॉपअप एक्स्टेंडर के अंदर प्रदर्शित होता है। पुनरावर्तक माईडीटीओ ऑब्जेक्ट्स की सरणी सूची का उपयोग करके डाटाबेस है। इसके लिए दो बटन हैं सूची में प्रत्येक आइटम। ImageURL और CommandArgument को बाध्य करने पर सेट किया गया है।अपडेट पैनेल, रिपेटर, डाटाबाइंडिंग समस्या

यह कोड पहली बार ठीक काम करता है लेकिन इसके बाद कमांडअर्गमेंट गलत है। ऐसा लगता है कि डिस्प्ले सही तरीके से अपडेट किया गया है लेकिन डीटीओ नहीं है और भेजा CommandArgument एक है कि बस हटा दिया गया है है।

किसी कोड के साथ कोई समस्या है सकते हैं?

संपादित करें: मैंने अभी कोड में एक CollapsiblePanelExtender जोड़ा है। जब मैं अब एक आइटम हटाता हूं और पैनल का विस्तार करता हूं, तो आइटम जिसे पहले हटा दिया गया था (और डिस्प्ले से चला गया) वापस आ गया है। ऐसा लगता है कि पुनरावर्तक को बोनेट के नीचे सही ढंग से पुनर्निर्मित नहीं किया गया है।

ASCX

<asp:UpdatePanel ID="ViewDataDetail" runat="server" ChildrenAsTriggers="true"> 
    <Triggers> 
     <asp:PostBackTrigger ControlID="ViewDataCloseButton" /> 
     <asp:AsyncPostBackTrigger ControlID="DataRepeater" /> 
    </Triggers> 
    <ContentTemplate> 
     <table width="100%" id="DataResults"> 
     <asp:Repeater ID="DataRepeater" runat="server" OnItemCommand="DataRepeater_ItemCommand" OnItemDataBound="DataRepeater_ItemDataBound"> 
     <HeaderTemplate> 
      <tr> 
      <th><b>Name</b></th> 
      <th><b>&nbsp;</b></th> 
      </tr> 
     </HeaderTemplate> 
      <ItemTemplate> 
      <tr> 
       <td> 
       <b><%#((MyDTO)Container.DataItem).Name%></b> 
       </td> 
       <td> 
       <asp:ImageButton CausesValidation="false" ID="DeleteData" CommandName="Delete" runat="server" /> 
       <asp:ImageButton CausesValidation="false" ID="RunData" CommandName="Run" runat="server" /> 
       </td> 
      </tr> 
      <tr> 
       <td colspan="2"> 
       <table> 
        <tr> 
        <td>Description : </td> 
        <td><%#((MyDTO)Container.DataItem).Description%></td> 
        </tr> 
        <tr> 
        <td>Search Text : </td> 
        <td><%#((MyDTO)Container.DataItem).Text%></td> 
        </tr> 
       </table> 
       </td> 
      </tr> 
      </ItemTemplate> 
     </asp:Repeater> 
     </table> 
    </ContentTemplate> 
</asp:UpdatePanel> 

कोड-पीछे

public DeleteData DeleteDataDelegate; 
    public RetrieveData PopulateDataDelegate; 
    public delegate ArrayList RetrieveData(); 
    public delegate void DeleteData(String sData); 


protected void Page_Load(object sender, EventArgs e) 
    { 
     //load the initial data.. 
     if (!Page.IsPostBack) 
     { 
      if (PopulateDataDelegate != null) 
      { 
       this.DataRepeater.DataSource = this.PopulateDataDelegate(); 
       this.DataRepeater.DataBind(); 
      } 
     } 
    } 

    protected void DataRepeater_ItemCommand(object source, RepeaterCommandEventArgs e) 
    { 
     if (e.CommandName == "Delete") 
     { 
      if (DeleteDataDelegate != null) 
      { 
       DeleteDataDelegate((String)e.CommandArgument); 
       BindDataToRepeater(); 
      } 
     } 
     else if (e.CommandName == "Run") 
     { 
      String sRunning = (String)e.CommandArgument; 
      this.ViewDataModalPopupExtender.Hide(); 
     } 
    } 

    protected void DataRepeater_ItemDataBound(object source, RepeaterItemEventArgs e) 
    { 
     RepeaterItem item = e.Item; 
     if (item != null && item.DataItem != null) 
     { 
      MyDTO oQuery = (MyDTO)item.DataItem; 

      ImageButton oDeleteControl = (ImageButton) item.FindControl("DeleteData"); 
      ImageButton oRunControl = (ImageButton)item.FindControl("RunData"); 

      if (oDeleteControl != null && oRunControl !=null) 
      { 
       oRunControl.ImageUrl = "button_expand.gif"; 
       oRunControl.CommandArgument = "MyID"; 
       if (oQuery !=null) 
       { 
        //do something 
       } 
       oDeleteControl.ImageUrl = "btn_remove.gif"; 
       oDeleteControl.CommandArgument = "MyID"; 
      } 
     } 
    } 

    public void BindDataToRepeater() 
    { 
     this.DataRepeater.DataSource = this.PopulateDataDelegate(); 
     this.DataRepeater.DataBind(); 
    } 

    public void ShowModal(object sender, EventArgs e) 
    { 
     BindDataToRepeater(); 
     this.ViewDataModalPopupExtender.Show(); 
    } 
+0

क्या आपके 'ItemDataBound' हैंडलर से कोड गुम है? उस विधि के अंदर, आप 'माईडीटीओ' चर ('oQuery') घोषित करते हैं और फिर इसका कभी भी उपयोग नहीं करते हैं। –

+0

क्षमा करें, हाँ, मैंने इसे ब्रेवटी –

उत्तर

7

मुझे याद दिलाने के लिए धन्यवाद कि मैंने एएसपी.NET नियंत्रणों का उपयोग क्यों बंद कर दिया। यह सही प्रकार का दुःस्वप्न है जिसने बजट और अनुसूची के दौरान बहुत सी परियोजनाएं की हैं।

मेरी सलाह है कि आप इसे लागू करने का सबसे आसान तरीका सोचें। आप इसे ASP.NET तरीके से काम करने या सबसे छोटा रास्ता लेने के लिए पीछे की तरफ मोड़ने का प्रयास कर सकते हैं। आप जो भी कर रहे हैं वह HTML उत्पन्न कर रहा है, यह कभी भी मुश्किल नहीं होना चाहिए।

आपकी समस्या का सबसे अधिक संभावित कारण यह है कि व्यूस्टेट पृष्ठ में संग्रहीत है जो आंशिक पोस्टबैक पर अपडेट नहीं होता है। तो अद्यतन पैनल में प्रत्येक बदलाव के साथ आप पृष्ठ के प्रारंभिक दृश्यमान को पोस्टबैक करेंगे।

पुनरावर्तक को एक साधारण फॉर-लूप के साथ बदलने का प्रयास करें (और शिकायत शुरू करने वाले लोगों को अनदेखा करें, आपको मार्कअप और कोड मिश्रण नहीं करना चाहिए)। अपने डेटाबेस स्टेटमेंट को <%= %> के साथ बदलें। जो दृश्य को सभी को एक साथ हटा देता है और किसी भी हटाए गए पंक्ति को फिर से दिखने से हटा देना चाहिए।

+0

के लिए छंटनी की है, आप पूरी तरह से सही हैं, मैंने इनके साथ परेशान करना बंद कर दिया है और सब कुछ वेबसाइसेस के साथ jQuery है। मेरा जीवन 100% आसान है और सब कुछ लागू करने के लिए बहुत तेज है .. –

1

इस के साथ चारों ओर खिलवाड़ के कई दिनों के बाद मैं इस समस्या के लिए एक उचित ठीक नहीं मिला लेकिन ऐसा किया है एक व्यावहारिक काम के आसपास है ।

CollapsiblePanelExtender स्वचालित रूप से पोस्टबैक पर सेट नहीं है जो हटाए गए डेटा के मुद्दे को फिर से प्रकट करता है जब विस्तारक खोला जाता है। मेरा मुद्दा, मेरा मानना ​​है, संबंधित है।

ऐसा लगता है कि पुनरावर्तक के लिए व्यूस्टेट डेटा के साथ सिंक हो गया है। e.CommandArgument हमेशा सही नहीं होता है और पिछले डेटा को संदर्भित करता है। मॉड्यूल डायलॉग खोलते समय और e.Item.ItemIndex से पुनर्प्राप्त आईडी का उपयोग करके हटाने के लिए सही तत्व खोजने के लिए मैंने व्यूस्टेट में MyDTO ऑब्जेक्ट्स के ArrayList को संग्रहीत करके इसे ठीक करने का प्रयास किया। यह सही ढंग से काम नहीं करता है, व्यूस्टेट से निकाला गया ऐरेलिस्ट सिंक से बाहर था।

सत्र में ArrayList भंडारण यह सब काम जो मुझे विश्वास है कि मैं कुछ मौलिक रूप से गलत कर रहा हूँ या वहाँ टूलकिट है कि मैं उपयोग कर रहा हूँ के संस्करण में एक सूक्ष्म बग है (हम अभी भी कर रहे हैं बनाता है वीएस2005 टूलकिट के पुराने संस्करण के साथ फंस गए हैं)

क्षमा करें अगर इसका कोई मतलब नहीं है, तो मुझसे संपर्क करें यदि आप किसी भी चीज़ पर स्पष्टीकरण चाहते हैं।

1

का उपयोग कर

((IDataItemContainer) कंटेनर) .DataItem

के बजाय " Container.DataItem"

यह मेरे लिए काम किया

कोशिश।

संबंधित मुद्दे