I have a hierarchial grid that will have 3 levels to it. I want to keep this example as simple as possible so let's say the grid has 2 visible columns on the first 2 levels - a number column and button column. The 3rd level has only a number column. If the button is pushed on the 1st or 2nd level, the number column should be set to zero and all related child rows in the hierarchy below should be set to zero. All rows updated should have the background set to a color, red for the sake of argument.
How can this be accomplished with VB.Net code?
Here's some starter code. More columns will be visible than the 2, but just ignore them.
How can this be accomplished with VB.Net code?
Here's some starter code. More columns will be visible than the 2, but just ignore them.
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Grid.aspx.vb" Inherits="Grid" %> |
<%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %> |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
<html xmlns="http://www.w3.org/1999/xhtml" > |
<head runat="server"> |
<title>Untitled Page</title> |
<style type="text/css"> |
.ZeroedOut |
{ |
background-color:pink; |
} |
</style> |
</head> |
<body> |
<form id="form1" runat="server"> |
<div> |
<telerik:RadScriptManager ID="RadScriptManager1" runat="server"> |
</telerik:RadScriptManager> |
<telerik:RadGrid ID="grdOR" runat="server" AutoGenerateColumns="False" GridLines="None" Width="100%" Skin="WebBlue" > |
<MasterTableView DataKeyNames="STYL_SEQ_NUM,RVD_QTY" AllowAutomaticUpdates="True" NoDetailRecordsText="No SKU records to display." NoMasterRecordsText="No Style records to display." EditMode="InPlace"> |
<DetailTables> |
<telerik:GridTableView runat="server" DataKeyNames="MSC_MDSE_NUM" NoDetailRecordsText="No Store records to display." > |
<RowIndicatorColumn> |
<HeaderStyle Width="20px" /> |
</RowIndicatorColumn> |
<ExpandCollapseColumn Visible="True"> |
<HeaderStyle Width="20px" /> |
</ExpandCollapseColumn> |
<Columns> |
<telerik:GridBoundColumn DataField="CLR_CDE" HeaderText="Color Code" UniqueName="CLR_CDE" > |
</telerik:GridBoundColumn> |
<telerik:GridBoundColumn DataField="CLR_DCD" HeaderText="Color Desc" UniqueName="CLR_DCD" > |
</telerik:GridBoundColumn> |
<telerik:GridBoundColumn DataField="STYL_SEQ_NUM" HeaderText="SSN" UniqueName="STYL_SEQ_NUM" > |
</telerik:GridBoundColumn> |
<telerik:GridBoundColumn DataField="MSC_MDSE_NUM" HeaderText="MSC" UniqueName="MSC_MDSE_NUM" > |
</telerik:GridBoundColumn> |
<telerik:GridBoundColumn DataField="RVD_QTY" HeaderText="RVD_QTY" UniqueName="RVD_QTY" ItemStyle-Width="50px" HeaderStyle-Width="50px"> |
</telerik:GridBoundColumn> |
<telerik:GridButtonColumn ButtonType="PushButton" Text="Zero" UniqueName="ZERO" CommandName="ZEROSKU" ItemStyle-Width="50px" HeaderStyle-Width="50px"> |
</telerik:GridButtonColumn> |
</Columns> |
<DetailTables> |
<telerik:GridTableView runat="server" DataKeyNames="STOR_CDE,MSC_MDSE_NUM,RVD_QTY" EditMode="InPlace" AllowAutomaticUpdates="True" Width="100%" > |
<RowIndicatorColumn> |
<HeaderStyle Width="20px" /> |
</RowIndicatorColumn> |
<ExpandCollapseColumn> |
<HeaderStyle Width="20px" /> |
</ExpandCollapseColumn> |
<Columns> |
<telerik:GridEditCommandColumn /> |
<telerik:GridTemplateColumn DataField="STOR_CDE" HeaderText="Store" UniqueName="STOR_CDE" > |
<ItemTemplate> |
<%#Eval("STOR_CDE")%> |
</ItemTemplate> |
<EditItemTemplate> |
<asp:TextBox ID="txtStore" runat="server" Text='<%# Bind("STOR_CDE") %>' ReadOnly='<%# IIf(DataBinder.Eval(Container, "OwnerTableView.IsItemInserted"), "False", "True") %>'/> |
</EditItemTemplate> |
</telerik:GridTemplateColumn> |
<telerik:GridTemplateColumn DataField="ORDR_QTY" HeaderText="Quantity" UniqueName="ORDR_QTY"> |
<ItemTemplate> |
<%#Eval("ORDR_QTY")%> |
</ItemTemplate> |
<EditItemTemplate> |
<asp:TextBox ID="txtOrderQty" runat="server" Text='<%# Bind("ORDR_QTY") %>' ReadOnly='<%# IIf(DataBinder.Eval(Container, "OwnerTableView.IsItemInserted"), "False", "True") %>' /> |
</EditItemTemplate> |
</telerik:GridTemplateColumn> |
<telerik:GridTemplateColumn DataField="MSC_MDSE_NUM" HeaderText="MSC" UniqueName="MSC_MDSE_NUM"> |
<ItemTemplate> |
<%#Eval("MSC_MDSE_NUM")%> |
</ItemTemplate> |
<EditItemTemplate> |
<%# Eval("MSC_MDSE_NUM") %> |
</EditItemTemplate> |
</telerik:GridTemplateColumn> |
<telerik:GridTemplateColumn DataField="RVD_QTY" HeaderText="RVD_QTY" UniqueName="RVD_QTY" ItemStyle-Width="110px" HeaderStyle-Width="110px"> |
<ItemTemplate> |
<%#Eval("RVD_QTY")%> |
</ItemTemplate> |
<EditItemTemplate> |
<asp:TextBox ID="txtRevisedQuantity" runat="server" Text='<%# Bind("RVD_QTY") %>' /> |
</EditItemTemplate> |
</telerik:GridTemplateColumn> |
</Columns> |
<EditFormSettings> |
<EditColumn UniqueName="EditCommandColumn1"> |
</EditColumn> |
</EditFormSettings> |
</telerik:GridTableView> |
</DetailTables> |
</telerik:GridTableView> |
</DetailTables> |
<RowIndicatorColumn> |
<HeaderStyle Width="20px" /> |
</RowIndicatorColumn> |
<ExpandCollapseColumn Visible="True"> |
<HeaderStyle Width="20px" /> |
</ExpandCollapseColumn> |
<Columns> |
<telerik:GridBoundColumn DataField="ITEM_DES" HeaderText="Desc" UniqueName="ITEM_DES"> |
</telerik:GridBoundColumn> |
<telerik:GridBoundColumn DataField="VEN_STYL_NUM" HeaderText="Style" UniqueName="VEN_STYL_NUM"> |
</telerik:GridBoundColumn> |
<telerik:GridBoundColumn DataField="STYL_SEQ_NUM" HeaderText="SSN" UniqueName="STYL_SEQ_NUM"> |
</telerik:GridBoundColumn> |
<telerik:GridTemplateColumn DataField="RVD_QTY" HeaderText="RVD_QTY" UniqueName="RVD_QTY" ItemStyle-Width="50px" HeaderStyle-Width="50px"> |
<ItemTemplate> |
<%#Eval("RVD_QTY")%> |
</ItemTemplate> |
<EditItemTemplate> |
<asp:TextBox ID="txtRevisedStyle" runat="server" Text='<%# Bind("RVD_QTY") %>' /> |
</EditItemTemplate> |
</telerik:GridTemplateColumn> |
<telerik:GridButtonColumn ButtonType="PushButton" Text="Zero" UniqueName="ZERO" CommandName="ZEROSTYLE" ItemStyle-Width="50px" HeaderStyle-Width="50px"> |
</telerik:GridButtonColumn> |
</Columns> |
<EditFormSettings > |
<PopUpSettings Modal="True" /> |
</EditFormSettings> |
</MasterTableView> |
<ClientSettings> |
<Scrolling AllowScroll="True" UseStaticHeaders="True" /> |
</ClientSettings> |
</telerik:RadGrid> |
</div> |
</form> |
</body> |
</html> |
Imports System.Data |
Imports Telerik.Web.UI |
Partial Class Grid |
Inherits System.Web.UI.Page |
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load |
End Sub |
Protected Sub grdOR_DetailTableDataBind(ByVal source As Object, ByVal e As Telerik.Web.UI.GridDetailTableDataBindEventArgs) Handles grdOR.DetailTableDataBind |
Dim parentItem As GridDataItem = CType(e.DetailTableView.ParentItem, GridDataItem) |
If parentItem.Edit Then |
Return |
End If |
Dim DataKeys() As String = parentItem.KeyValues.Split(",") |
If e.DetailTableView.HierarchyIndex = "0" Then |
If ViewState(e.DetailTableView.ClientID) Is Nothing Then |
Dim Keys() As String = DataKeys(0).Split(":") |
e.DetailTableView.DataSource = PopulateSKULevel(Keys(1).Replace("""", "").Replace("}", "")) |
ee.DetailTableView.Name = e.DetailTableView.ClientID |
ViewState(e.DetailTableView.ClientID) = e.DetailTableView.DataSource |
Else |
e.DetailTableView.DataSource = ViewState(e.DetailTableView.ClientID) |
End If |
ElseIf e.DetailTableView.HierarchyIndex.Substring(0, 2) = "0_" Then |
If ViewState(e.DetailTableView.ClientID) Is Nothing Then |
Dim Keys() As String = DataKeys(0).Split(":") |
e.DetailTableView.DataSource = PopulateStoreLevel(Keys(1).Replace("""", "").Replace("}", "")) |
ee.DetailTableView.Name = e.DetailTableView.ClientID |
ViewState(e.DetailTableView.ClientID) = e.DetailTableView.DataSource |
Else |
e.DetailTableView.DataSource = ViewState(e.DetailTableView.ClientID) |
If ViewState("grdOR_Event") = "STOREUPDATED" Then |
Dim parentSKU As GridDataItem = CType(e.DetailTableView.ParentItem, GridDataItem) |
Dim parentStyle As GridDataItem = CType(parentSKU.OwnerTableView.ParentItem, GridDataItem) |
parentSKU.OwnerTableView.DataSource = ViewState(ViewState("grdOR_DataSource_SKU").ToString) |
parentStyle.OwnerTableView.DataSource = ViewState(ViewState("grdOR_DataSource_Style").ToString) |
ViewState("grdOR_Event") = "" |
ViewState("grdOR_DataSource_SKU") = "" |
ViewState("grdOR_DataSource_Style") = "" |
End If |
End If |
End If |
End Sub |
Protected Sub grdOR_ItemCommand(ByVal source As Object, ByVal e As Telerik.Web.UI.GridCommandEventArgs) Handles grdOR.ItemCommand |
Select Case e.CommandName |
Case "ZEROSTYLE" |
Dim StyleItem As GridDataItem = CType(e.Item, GridDataItem) |
Dim dtStyle As DataTable = ViewState(grdOR.ClientID) |
Dim SSN As String = StyleItem.OwnerTableView.DataKeyValues(StyleItem.ItemIndex)("STYL_SEQ_NUM").ToString |
Dim Revised As String = StyleItem.OwnerTableView.DataKeyValues(StyleItem.ItemIndex)("RVD_QTY").ToString |
ZeroParentRow(StyleItem, dtStyle, SSN, e.Canceled) |
StyleItem.CssClass = "ZeroedOut" |
If StyleItem.Expanded Then |
For Each SKUItem As GridDataItem In StyleItem.ChildItem.NestedTableViews(0).Items |
Dim dtSKU As DataTable = ViewState(SKUItem.OwnerTableView.Name) |
ZeroParentRow(SKUItem, dtSKU, SSN, e.Canceled) |
Next |
StyleItem.Expanded = True |
End If |
Case "ZEROSKU" |
End Select |
End Sub |
Public Sub ZeroParentRow(ByRef RowItem As GridDataItem, ByRef dt As DataTable, ByVal SSN As String, ByRef Canceled As Boolean) |
Dim changedRows() As DataRow = dt.Select("STYL_SEQ_NUM = " & SSN) |
If (changedRows.Length <> 1) Then |
'MeMe.Label1.Text = Me.Label1.Text + "Unable to locate the Order for updating." |
Canceled = True |
Return |
End If |
changedRows(0).BeginEdit() |
Try |
changedRows(0)("RVD_QTY") = 0 |
changedRows(0).EndEdit() |
changedRows(0).AcceptChanges() |
grdOR.DataSource = dt |
'grdOR.Rebind() |
ViewState(RowItem.OwnerTableView.ClientID) = dt |
'RowItem.Expanded = True |
Catch ex As Exception |
changedRows(0).CancelEdit() |
'Label1Label1.Text = Label1.Text & "Unable to update Orders. Reason: " & ex.Message |
Canceled = True |
End Try |
End Sub |
Protected Sub grdOR_NeedDataSource(ByVal source As Object, ByVal e As Telerik.Web.UI.GridNeedDataSourceEventArgs) Handles grdOR.NeedDataSource |
grdOR.DataSource = PopulateStyleLevel() |
ViewState(grdOR.ClientID) = grdOR.DataSource |
End Sub |
Private Function CalculateStoreTotal(ByVal dt As DataTable) As Integer |
Dim newValues As New Hashtable |
Dim Total As Integer = 0 |
For Each r As DataRow In dt.Rows |
Total += Convert.ToInt32(r("RVD_QTY")) |
Next |
Return Total |
End Function |
Private Function PopulateStyleLevel() As DataTable |
Dim dt As New DataTable |
Dim c1 As New DataColumn |
Dim c2 As New DataColumn |
Dim c3 As New DataColumn |
Dim c4 As New DataColumn |
c1.ColumnName = "ITEM_DES" |
c2.ColumnName = "VEN_STYL_NUM" |
c3.ColumnName = "STYL_SEQ_NUM" |
c4.ColumnName = "RVD_QTY" |
dt.Columns.Add(c1) |
dt.Columns.Add(c2) |
dt.Columns.Add(c3) |
dt.Columns.Add(c4) |
Dim r As DataRow = dt.NewRow |
r("ITEM_DES") = "Test Item 1" |
r("VEN_STYL_NUM") = "TEST100" |
r("STYL_SEQ_NUM") = "0123456789999" |
r("RVD_QTY") = "20" |
dt.Rows.Add(r) |
r = dt.NewRow |
r("ITEM_DES") = "Test Item 2" |
r("VEN_STYL_NUM") = "TEST200" |
r("STYL_SEQ_NUM") = "0123456788888" |
r("RVD_QTY") = "10" |
dt.Rows.Add(r) |
'grdOR.DataSource = dt |
'grdOR.DataSource = New DataView(dt) |
'grdOR.DataBind() |
Return dt |
End Function |
Private Function PopulateSKULevel(ByVal SSN As String) As DataTable |
Dim dt As New DataTable |
Dim c1 As New DataColumn |
Dim c2 As New DataColumn |
Dim c3 As New DataColumn |
Dim c4 As New DataColumn |
Dim c5 As New DataColumn |
c1.ColumnName = "CLR_CDE" |
c2.ColumnName = "CLR_DCD" |
c3.ColumnName = "STYL_SEQ_NUM" |
c4.ColumnName = "MSC_MDSE_NUM" |
c5.ColumnName = "RVD_QTY" |
dt.Columns.Add(c1) |
dt.Columns.Add(c2) |
dt.Columns.Add(c3) |
dt.Columns.Add(c4) |
dt.Columns.Add(c5) |
Dim r As DataRow = dt.NewRow |
r("CLR_CDE") = "100" |
r("CLR_DCD") = "BLUE" |
r("STYL_SEQ_NUM") = "0123456789999" |
r("MSC_MDSE_NUM") = "0123456789999" |
r("RVD_QTY") = "20" |
dt.Rows.Add(r) |
r = dt.NewRow |
r("CLR_CDE") = "200" |
r("CLR_DCD") = "RED" |
r("STYL_SEQ_NUM") = "0123456788888" |
r("MSC_MDSE_NUM") = "0123456788888" |
r("RVD_QTY") = "10" |
dt.Rows.Add(r) |
r = dt.NewRow |
r("CLR_CDE") = "300" |
r("CLR_DCD") = "YELLOW" |
r("STYL_SEQ_NUM") = "0123456788888" |
r("MSC_MDSE_NUM") = "0123456787777" |
r("RVD_QTY") = "40" |
dt.Rows.Add(r) |
Dim rows() As DataRow = dt.Select("STYL_SEQ_NUM = '" & SSN & "'") |
Dim dtRet As DataTable = dt.Clone |
For Each row As DataRow In rows |
r = dtRet.NewRow |
r(0) = row(0) |
r(1) = row(1) |
r(2) = row(2) |
r(3) = row(3) |
r(4) = row(4) |
dtRet.Rows.Add(r) |
Next |
'dtRet.TableName = "SKU" |
Return dtRet |
End Function |
Private Function PopulateStoreLevel(ByVal MSC As String) As DataTable |
Dim dt As New DataTable |
Dim c1 As New DataColumn |
Dim c2 As New DataColumn |
Dim c3 As New DataColumn |
Dim c4 As New DataColumn |
c1.ColumnName = "STOR_CDE" |
c2.ColumnName = "ORDR_QTY" |
c3.ColumnName = "MSC_MDSE_NUM" |
c4.ColumnName = "RVD_QTY" |
dt.Columns.Add(c1) |
dt.Columns.Add(c2) |
dt.Columns.Add(c3) |
dt.Columns.Add(c4) |
Dim r As DataRow = dt.NewRow |
r("STOR_CDE") = "21" |
r("ORDR_QTY") = "5" |
r("MSC_MDSE_NUM") = "0123456789999" |
r("RVD_QTY") = "20" |
dt.Rows.Add(r) |
r = dt.NewRow |
r("STOR_CDE") = "54" |
r("ORDR_QTY") = "7" |
r("MSC_MDSE_NUM") = "0123456788888" |
r("RVD_QTY") = "10" |
dt.Rows.Add(r) |
r = dt.NewRow |
r("STOR_CDE") = "67" |
r("ORDR_QTY") = "5" |
r("MSC_MDSE_NUM") = "0123456787777" |
r("RVD_QTY") = "40" |
dt.Rows.Add(r) |
Dim rows() As DataRow = dt.Select("MSC_MDSE_NUM = '" & MSC & "'") |
Dim dtRet As DataTable = dt.Clone |
For Each row As DataRow In rows |
r = dtRet.NewRow |
r(0) = row(0) |
r(1) = row(1) |
r(2) = row(2) |
r(3) = row(3) |
dtRet.Rows.Add(r) |
Next |
Return dtRet |
End Function |
End Class |