2010-06-09 88 views
5

在用戶控件中,我在UpdatePanel中有一個Repeater(這個id顯示在ModalPopupExtender中,Repeater是使用MyDTO對象的數組列表的數據綁定。每個項目在列表中。綁定後ImageURL和CommandArgument被設置。UpdatePanel,Repeater,DataBinding問題

這段代碼第一次正常工作,但CommandArgument之後是錯誤的。看起來好像顯示更新正確,但DTO不是, 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'處理程序中是否缺少代碼?在該方法內部,你聲明一個'MyDTO'變量('oQuery'),然後永遠不要使用它。 – 2010-06-09 18:29:09

+0

對不起,是的,爲了簡潔,我將它縮小了 – 2010-06-09 18:45:54

回答

7

感謝提醒我爲什麼我停止使用ASP.NET控件。這是噩夢的確切類型,導致太多項目超出預算和時間表。

我的建議是想想最簡單的方法來實現這一點。您可以嘗試向後彎曲,以便使其以ASP.NET方式工作或採用最短路線。 你所做的只是生成HTML,它不應該那麼困難。

問題最可能的原因是ViewState存儲在頁面中,該頁面在部分回發中未得到更新。因此,更新面板中的每一項更改都會回傳頁面的初始視圖狀態。

嘗試用簡單的for-loop代替repeater(並忽略開始抱怨的人不應該混合標記和代碼)。用<%= %>替換您的數據綁定語句。 這消除了視圖狀態,並應刪除重新顯示的任何已刪除的行。

+0

你是完全正確的,我現在不再煩惱這些了,一切都是jQuery與webservices。我的生活是100%更容易,一切都更快實施.. – 2011-08-18 10:45:55

1

後本亂搞的許多天,我還沒有發現針對該問題的適當修復,但確實有一個可行的變通。

CollapsiblePanelExtender設置爲不自動回發,修復了擴展器打開時重新顯示的已刪除數據的問題。我相信另一個問題是相關的。

看起來Repeater的ViewState與數據不同步。 e.CommandArgument並不總是正確的,似乎引用了以前的數據。我試圖通過將MyDTO對象的ArrayList存儲在ViewState中來打開Modal對話框並使用從e.Item.ItemIndex中檢索到的ID來查找要刪除的正確元素。這不能正常工作,撤出ViewState的ArrayList不同步。

在會話中存儲ArrayList會使所有工作使我相信我正在做一些根本性錯誤或者我正在使用的工具包版本中存在一個微妙的錯誤(我們仍然在VS2005所以都卡住了舊版本的工具包)

道歉,如果這沒有意義,聯繫我,如果你想澄清任何事情。

1

嘗試使用

((IDataItemContainer)集裝箱).DataItem

,而不是 「Container.DataItem

它爲我工作。