2013-07-17 43 views
0

我能創建使用在Page_Load中從一個叫Data_Binder()子填充DataSet中一個美麗的,四代嵌套DataList控件(父母,子女,孫子女,GreatGrandChild)。我對數據顯示的速度和正確性感到非常滿意。編輯嵌套DataList的錯誤

然而,當我點擊我的GreatGrandChild DataList的編輯按鈕,這應該在EditItemTemplate中顯示的信息完全消失,而不是讓我來編輯。這就是它看起來像在初始顯示:

Jul 2013 
Stat Forecast Sales Brand 
100   116 Drop 80 % 
Testing Insert 
Part Number Mix DP Adj SP 
8521150 30% 8 8 Edit 
8521148 20% 5 5 Edit 
8523458 10% 3 3 Edit 
8524400 7% 2 2 Edit 
8524276 6% 2 2 Edit 
8523165 6% 2 2 Edit 
8523985 5% 1 2 3 Edit 
8523456 5% 1 1 Edit 
8524403 4% 1 1 Edit 
8524399 4% 1 1 Edit 
8523987 3% 1 1 Edit 
8524402 1% 0 0 Edit 

單擊編輯使它成爲這樣:

Jul 2013 
Stat Forecast Sales Brand 
100   116 Drop 80 % 
Testing Insert 

我包括我的GetChildRelation,Data_Binder和Edit_Command潛艇,所以你可以看到什麼是觸發以及我的GreatGrandChild DataList。爲簡潔起見,我沒有包含HeaderTemplate和ItemTemplate,因爲這些工作正常。

我想繼續使用該數據集的方法呈現的數據是夢幻般的速度。

有什麼建議嗎?

感謝,
羅布

嵌套DataList的片段......

<asp:DataList ID="DL_Supply_Plan_Date_Numbers_SP" runat="server" 
    CssClass="DP_DL_Supply_Plan_Date_Numbers_SP" 
    OnEditCommand="Edit_Command" 
    OnUpdateCommand="Update_Command" 
    OnCancelCommand="Cancel_Command" 
    DataSource='<%# GetChildRelation(Container.DataItem, "Fam_Date_GrandChild")%>' 
    > 
    <HeaderTemplate> ... </HeaderTemplate> 
    <ItemTemplate> ... </ItemTemplate> 
    <EditItemTemplate> 

     <asp:Label ID="lbl_dat_DP_Date_Numbers_hidden" runat="server" CssClass="hidden" 
      Text='<%#Container.DataItem("dat_DP_Date")%>' /> 
     <asp:Label ID="lbl_txt_Part_Num_hidden" runat="server" CssClass="hidden" 
      Text='<%#Container.DataItem("txt_Part_Num")%>' /> 

     <asp:Label ID="lbl_txt_Family_Part_Num" runat="server" CssClass="SP_Family_Member" 
      Text='<%#DataBinder.Eval(Container.DataItem,"txt_Family_Part_Num")%>' /> 
     <asp:Label ID="lbl_num_Mix_Weight" runat="server" CssClass="SP_Family_Member SP_Mix" 
      Text='<%#DataBinder.Eval(Container.DataItem,"num_Mix_Weight","{0:0%}")%>' /> 
     <asp:Label ID="lbl_DP_Unconstrained" runat="server" CssClass="SP_Family_Member SP_Mix DP" 
      Text='<%# Display_Supply_Plan(Eval("num_Mix_Weight"),Eval("num_DP_Number"),Eval("num_Brand_Number"),0) %>' /> 
     <asp:TextBox ID="tbx_num_SP_Adjust" runat="server" CssClass="SP_Family_Member SP_Mix SP-Adjust" 
      Text='<%#DataBinder.Eval(Container.DataItem,"num_SP_Adjust")%>' /> 
     <asp:Label ID="lbl_SP" runat="server" CssClass="SP_Family_Member SP_Mix SP" 
      Text='<%# Display_Supply_Plan(Eval("num_Mix_Weight"),Eval("num_DP_Number"),Eval("num_Brand_Number"),Eval("num_SP_Adjust")) %>' /> 
     <br /> 
     <asp:LinkButton ID="lnkUpdate" runat="server" CommandName="update">Update</asp:LinkButton> 
     &nbsp;&nbsp; 
     <asp:LinkButton ID="lnkCancel" runat="server" CommandName="cancel">Cancel</asp:LinkButton> 

    </EditItemTemplate> 
</asp:DataList> 

後面的代碼......

Protected Function GetChildRelation(dataItem As Object, relation As String) As DataView 
    Dim drv As DataRowView = TryCast(dataItem, DataRowView) 
    If drv IsNot Nothing Then 
     Return drv.CreateChildView(relation) 
    Else 
     Return Nothing 
    End If 
End Function 

Sub Data_Binder() 

    Dim strConn As String = System.Configuration.ConfigurationManager.ConnectionStrings("TestConnectionString").ConnectionString 

    Dim Cat_Fam_Filter As String = "Where txt_Family_Category Like '" & ddl_Family_Category_Name.SelectedValue & "' " _ 
            & "and txt_Family_Name Like '" & ddl_Family_Name.SelectedValue & "'" 

    Dim strSql As String = "SELECT * FROM tbl_Family " & Cat_Fam_Filter & " Order By txt_Family_Category, txt_Family_Name ; " _ 
          & "SELECT * FROM func_Display_Demand_Plan() " & Cat_Fam_Filter & " Order by dat_DP_Date; " _ 
          & "SELECT * FROM func_Display_Demand_Plan() " & Cat_Fam_Filter & " Order by dat_DP_Date; " _ 
          & "SELECT * FROM func_Display_Supply_Plan() " & Cat_Fam_Filter & " " _ 
          & "order by dat_DP_Date, num_Mix_Weight DESC " 

    Dim conn As New SqlConnection(strConn) 
    Dim da As New SqlDataAdapter(strSql, conn) 
    da.TableMappings.Add("Family1", "Dates") 
    da.TableMappings.Add("Family2", "Demand") 
    da.TableMappings.Add("Family3", "Supply") 

    _ds = New DataSet() 

    da.Fill(_ds, "Family") 

    _ds.Relations.Add("Fam_Date_Parent", _ds.Tables("Family").Columns("txt_Family_Name"), _ds.Tables("Dates").Columns("txt_Family_Name")) 
    _ds.Relations(0).Nested = True 
    _ds.Relations.Add("Fam_Date_Child", _ds.Tables("Dates").Columns("FamDateKey"), _ds.Tables("Demand").Columns("FamDateKey")) 
    _ds.Relations(1).Nested = True 
    _ds.Relations.Add("Fam_Date_GrandChild", _ds.Tables("Demand").Columns("FamDateKey"), _ds.Tables("Supply").Columns("FamDateKey"), False) 
    _ds.Relations(2).Nested = True 

    DL_Supply_Plan.DataSource = _ds.Tables("Family") 
    DL_Supply_Plan.DataBind() 


End Sub 

Sub Edit_Command(sender As Object, e As DataListCommandEventArgs) 

    Dim DL_Target As DataList = DirectCast(sender, DataList) 

    DL_Target.EditItemIndex = e.Item.ItemIndex 
    DL_Target.DataBind() 

End Sub 
+0

更新:遍歷代碼後,我發現Edit_Command的DL_Target.DataBind()按預期轉到DL_Supply_Plan_Date_Numbers_SP。但是,該DataList的DataSource需要將一個Container.DataItem發送到GetChildRelation。當它在這個過程中,它沒有任何內容。沒有DataSource ...不推進......我可以從Code Behind中顯式創建適當的DataSource嗎?不幸的是,我對DataRowViews不夠了解。 – AKDad

回答

0

由於GreatGrandChild正在通過採用集裝箱數據源填充。從GrandChild數據列表的DataItem中,只有DataGrid的GreatGrandChild DataList的任何嘗試都將爲空。我沒有填充整個DataView來獲得適當的DataRowView。

我的解決方案:爲父母,子女和孫爲GreatGrandChild一個DataSet,然後一個單獨的數據集。 GreatGrandChild現在通過GrandChild的OnItemDataBound事件進行填充以用於顯示。然後,我可以使用相同的DataBind來編輯,取消和更新/插入事件。它是獨立的,運行良好。