Ошибка редактирования вложенного списка данных
Мне удалось создать красивый четырехуровневый список данных (Parent, Child, GrandChild, GreatGrandChild), используя DataSet, заполненный в Page_Load, из подпрограммы Data_Binder(). Я очень доволен тем, как быстро и правильно отображаются данные.
Однако, когда я нажимаю кнопку "Изменить" в моем списке данных GreatGrandChild, информация, которая должна отображаться в шаблоне 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. Для краткости я не включаю HeaderTemplate и ItemTemplate, так как они работают просто отлично.
Я хотел бы продолжать использовать этот метод DataSet, так как скорость представления данных является фантастической.
Какие-либо предложения?
Спасибо,
обкрадывать
Вложенный фрагмент 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>
<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
1 ответ
Так как GreatGrandChild заполнялся через DataSource с использованием Container.DataItem из списка данных GrandChild, любая попытка DataBind только в GreatGrandChild DataList будет пустой. Я не заполнял весь DataView, чтобы получить соответствующий DataRowView.
Мое решение: создать DataSet для Parent, Child и GrandChild, а затем отдельный DataSet для GreatGrandChild. GreatGrandChild теперь заполняется через событие OnItemDataBound GrandChild для целей отображения. Затем я смог использовать одну и ту же DataBind для событий Edit, Cancel и Update/Insert. Это автономно и работает хорошо.