2013-07-17 1 views
0

Data_Binder()라는 하위의 Page_Load에 채워진 DataSet을 사용하여 4 세대 중첩 된 데이터 목록 (Parent, Child, GrandChild, GreatGrandChild)을 만들 수있었습니다. 데이터가 얼마나 빠르고 정확하게 표시되는지 매우 기쁩니다.중첩 데이터 목록 오류 편집

그러나 GreatGrandChild DataList의 Edit 버튼을 클릭하면 편집을 허용하지 않고 EditItemTemplate에 표시해야하는 정보가 완전히 사라집니다.

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

것은 당신이 무엇을 볼 수 있도록 내 GetChildRelation, Data_Binder 및 Edit_Command 서브 우퍼를 포함하고 있습니다 :

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 

클릭하면 편집이이 될 수 있습니다 : 이것은 초기 화면에서 모습입니다 트리거뿐만 아니라 내 GreatGrandChild 데이터 목록. 간결함을 위해 HeaderTemplate 및 ItemTemplate을 포함하지는 않습니다.

데이터를 표시하는 속도가 환상적이므로이 DataSet 메서드를 계속 사용하고 싶습니다.

제안 사항?

감사합니다,
강탈 GreatGrandChild이 컨테이너를 사용하여 데이터 소스를 통해 채워지 이후

중첩 된 DataList에 조각 ... BEHIND

<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> 

CODE ...

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에는 GetChildRelation에 보낼 Container.DataItem이 필요합니다. 이 작업이 진행되면 아무 것도 없습니다. 데이터 소스 없음 ... 진행하지 마십시오 ... 코드 숨김에서 적절한 데이터 소스를 명시 적으로 만들 수 있습니까? 불행히도 DataRowViews에 대해서는 충분히 알지 못합니다. – AKDad

답변

0

.DataItem을 GrandChild 데이터 목록에서 가져온 경우 GreatGrandChild DataList 만 DataBind를 시도하면 비어 있습니다. 적절한 DataRowView를 얻기 위해 전체 DataView를 채우지 않았습니다.

내 솔루션 : 부모, 자식 및 GrandChild에 대한 데이터 집합을 만들고 GreatGrandChild에 대한 별도의 데이터 집합을 만듭니다. GreatGrandChild는 이제 표시를 위해 GrandChild의 OnItemDataBound 이벤트를 통해 채워집니다. 그런 다음 편집, 취소 및 업데이트/삽입 이벤트에 대해서도 동일한 DataBind를 사용할 수있었습니다. 그것은 독립형이며 잘 작동합니다.