or
| DataMemberBinding="{Binding Difference, TargetNullValue=N/A}" |
| <Window x:Class="WTSCGCAppInterface.Header" |
| xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
| xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
| xmlns:TelerikInput="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Input" |
| Title="Header" Height="600" Width="800" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"> |
| <Grid> |
| <telerik:RadWrapPanel Height="60" Name="radPnlFilter" VerticalAlignment="Top"> |
| <Label Grid.Row="0" Grid.Column="0">Cust#:</Label> |
| <TextBox x:Name="txtCustNum" Width="50" Grid.Row="0" Grid.Column="0"></TextBox> |
| <Label Grid.Row="0" Grid.Column="0">Week Ending#:</Label> |
| <TelerikInput:RadMaskedTextBox x:Name="txtWeekEnding" Mask="##/##/####" Grid.Row="0" Grid.Column="0"></TelerikInput:RadMaskedTextBox> |
| <Label Grid.Row="0" Grid.Column="0">Job#:</Label> |
| <TextBox x:Name="txtJobNum" Width="50" Grid.Row="0" Grid.Column="0"></TextBox> |
| <Label Grid.Row="0" Grid.Column="0">Sub Job#:</Label> |
| <TextBox x:Name="txtSubJobNum" Width="50" Grid.Row="0" Grid.Column="0"></TextBox> |
| <Button x:Name="btnFilter" Click="btnFilter_Click">Apply Filter</Button> |
| </telerik:RadWrapPanel> |
| <telerik:RadGridView Margin="0,58,0,0" Name="radGrdVwHeader" AutoGenerateColumns="False" ColumnsWidthMode="Fill" RowLoaded="radGrdVwHeader_RowLoaded"> |
| <telerik:RadGridView.Columns> |
| <telerik:GridViewDataColumn Header="HSTAT" UniqueName="HSTAT" IsVisible="False" /> |
| <telerik:GridViewDataColumn Header="HCONO" UniqueName="HCONO" IsVisible="False" /> |
| <telerik:GridViewDataColumn Header="HDVNO" UniqueName="HDVNO" IsVisible="False" /> |
| <telerik:GridViewDataColumn Header="HSEQ" UniqueName="HSEQ" IsVisible="False" /> |
| <telerik:GridViewDataColumn Header="HCUST" UniqueName="HCUST" IsVisible="False" /> |
| <telerik:GridViewDataColumn Header="Job #" UniqueName="HJBNO" /> |
| <telerik:GridViewDataColumn Header="Sub Job #" UniqueName="HSJNO" /> |
| <telerik:GridViewDataColumn Header="Week Ending" UniqueName="HDTTK" /> |
| <telerik:GridViewDataColumn Header="HDSCD" UniqueName="HDSCD" IsVisible="False" /> |
| <telerik:GridViewDataColumn Header="Ticket#" UniqueName="HNUM0" /> |
| <telerik:GridViewDataColumn Header="Crew#" UniqueName="HDES0" /> |
| <telerik:GridViewDataColumn Header="District" UniqueName="HDES1" /> |
| <telerik:GridViewDataColumn Header="FMC#" UniqueName="HDES2" /> |
| <telerik:GridViewDataColumn Header="Division" UniqueName="HDES3" /> |
| <telerik:GridViewDataColumn Header="Local#" UniqueName="HDES4" /> |
| <telerik:GridViewDataColumn Header="Crew Type" UniqueName="HDES5" /> |
| <telerik:GridViewDataColumn Header="Zone" UniqueName="HDES6" /> |
| </telerik:RadGridView.Columns> |
| <telerik:RadGridView.ChildTableDefinitions> |
| <telerik:GridViewTableDefinition/> |
| </telerik:RadGridView.ChildTableDefinitions> |
| <telerik:RadGridView.HierarchyChildTemplate> |
| <DataTemplate> |
| <telerik:RadGridView x:Name="ProdData" AutoGenerateColumns="False"> |
| <telerik:RadGridView.Columns> |
| <telerik:GridViewDataColumn Header="PCWNO" UniqueName="PCWNO" /> |
| </telerik:RadGridView.Columns> |
| </telerik:RadGridView> |
| </DataTemplate> |
| </telerik:RadGridView.HierarchyChildTemplate> |
| </telerik:RadGridView> |
| </Grid> |
| </Window> |
| private void btnFilter_Click(object sender, RoutedEventArgs e) |
| { |
| string sWeekEnding = txtWeekEnding.MaskedText; |
| string sAlteredFormat = sWeekEnding.Substring(6, 4) + sWeekEnding.Substring(0, 2) + sWeekEnding.Substring(3, 2); |
| radGrdVwHeader.ItemsSource = _headerRecs.GetHeaderRecs(1, 0, Convert.ToDecimal(txtCustNum.Text), Convert.ToDecimal(sAlteredFormat), txtJobNum.Text, txtSubJobNum.Text, null, null, ""); |
| radGrdVwHeader.ChildTableDefinitions.Clear(); |
| GridViewTableDefinition proddataDefinition = new GridViewTableDefinition(); |
| proddataDefinition.Relation = new PropertyRelation("ProddataRecs"); |
| //this.radGrdVwHeader.TableDefinition.ChildTableDefinitions.Add(proddataDefinition); |
| this.radGrdVwHeader.ChildTableDefinitions.Add(proddataDefinition); |
| } |

| <CustomerTable> |
| <Customer> |
| <Name>John</Name> |
| <Sex>Male</Sex> |
| <AccountTable> |
| <Account> |
| <AccountNo>0001</AccountNo> |
| <Status>Active</Status> |
| </Account> |
| </AccountTable> |
| </Customer> |
| <Customer> |
| <Name>Lily</Name> |
| <Sex>Female</Sex> |
| <AccountTable> |
| <Account> |
| <AccountNo>0002</AccountNo> |
| <Status>Active</Status> |
| </Account> |
| <Account> |
| <AccountNo>0003</AccountNo> |
| <Status>Terminated</Status> |
| </Account> |
| </AccountTable> |
| </Customer> |
| </CustomerTable> |
I've managed to get the hierarchy to work using this DataTable object, but I would have to load the data of all child tables (in this case
the AccountTable) before binding to the ItemsSource of the RadGridView control. Is there anyway to load the child table data only when a row is expanded?
Also, for my case I cannot hard code the structure in class files (ie: creating Customer and Account classes) as shown in the examples in the demo.
2. Is there an event fired when a row is expanded to display child tables (ie: + sign clicked)?
3. Can anyone provide an example on how to use the BuildHierachyFromDataSet method in the RadGridView?
| namespace LTD.Desktop.Common |
| { |
| public class RadPaneGroupRegionAdapter : RegionAdapterBase<RadPaneGroup> |
| { |
| public RadPaneGroupRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) |
| : base(regionBehaviorFactory) |
| { |
| } |
| protected override void Adapt(IRegion region, RadPaneGroup regionTarget) |
| { |
| region.Views.CollectionChanged += (s, e) => |
| { |
| switch (e.Action) |
| { |
| case NotifyCollectionChangedAction.Add: |
| foreach (var item in e.NewItems.OfType<RadPane>()) |
| { |
| regionTarget.AddItem(item, Telerik.Windows.Controls.Docking.DockPosition.Center); |
| } |
| break; |
| case NotifyCollectionChangedAction.Remove: |
| foreach (var item in e.OldItems.OfType<RadPane>()) |
| { |
| item.RemoveFromParent(); |
| } |
| break; |
| case NotifyCollectionChangedAction.Replace: |
| { |
| var oldItems = e.OldItems.OfType<RadPane>(); |
| var newItems = e.NewItems.OfType<RadPane>(); |
| var newItemsEnumerator = newItems.GetEnumerator(); |
| foreach (var oldItem in oldItems) |
| { |
| var parent = oldItem.Parent as ItemsControl; |
| if (parent != null && parent.Items.Contains(oldItem)) |
| { |
| parent.Items[parent.Items.IndexOf(oldItem)] = newItemsEnumerator.Current; |
| if (!newItemsEnumerator.MoveNext()) |
| { |
| break; |
| } |
| } |
| else |
| { |
| oldItem.RemoveFromParent(); |
| regionTarget.Items.Add(newItemsEnumerator.Current); |
| } |
| } |
| } |
| break; |
| case NotifyCollectionChangedAction.Reset: |
| regionTarget |
| .EnumeratePanes() |
| .ToList() |
| .ForEach(p => p.RemoveFromParent()); |
| break; |
| default: |
| break; |
| } |
| }; |
| foreach (var view in region.Views.OfType<RadPane>()) |
| { |
| regionTarget.Items.Add(view); |
| } |
| } |
| protected override IRegion CreateRegion() |
| { |
| return new AllActiveRegion(); |
| } |
| } |
| } |
| namespace LTD.Examples.Modularity.Views |
| { |
| /// <summary> |
| /// Interaction logic for ExampleView.xaml |
| /// </summary> |
| public partial class ExampleView : RadDocumentPane |
| { |
| public ExampleView() |
| { |
| InitializeComponent(); |
| } |
| } |
| } |
| <telerik:RadDocumentPane x:Class="LTD.Examples.Modularity.Views.ExampleView" |
| xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
| xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
| xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" |
| Header="Example panel"/> |
| <!-- Workspaces container --> |
| <telerik:RadDocking Name="Workspaces" DockPanel.Dock="Bottom" cal:RegionManager.RegionName="Workspaces"> |
| <telerik:RadDocking.DocumentHost> |
| <telerik:RadSplitContainer> |
| <telerik:RadPaneGroup cal:RegionManager.RegionName="MainRegion" /> |
| </telerik:RadSplitContainer> |
| </telerik:RadDocking.DocumentHost> |
| </telerik:RadDocking> |