我有一个嵌套的数据网格(有三个数据网格)。在这里,我能够毫无问题地显示数据。
第一个数据网格有5行 这里出现的主要问题是当你点击第一个数据网格中的任何一行时我显示2个数据网格(有10行)
让我说我点击2个数据网格中的3行。它在第三个数据网格中显示进一步的记录。 再次当我点击2个数据网格中的5行时,它会在第三个数据网格中显示更多记录。 现在所有的节目都很好了
当你试图拼写2个数据网格中的3行时它会碰撞,但问题是第三个数据网格占据空间用于显示记录的高度(我们可以看到显示主要2个数据网格之间的空白区域和第三个数据网格
在每个网格的第一列中,我有一个按钮,我在这里写这个代码用于展开和collpase
这是我在所有datagrid按钮中实现的功能,我在其中展开了collpase。
希望我的问题很明确 。任何帮助都很棒
xaml page
<sdk:DataGrid MinHeight="100" x:Name="dgStudent " Width="300" SelectionMode="Extended" RowDetailsVisibilityMode="VisibleWhenSelected" >
<sdk:DataGrid.Columns >
<sdk:DataGridTemplateColumn >
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="btn"
Click="btn1_Click" >
</Button>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="ID" Width="100" >
<sdk:DataGridTemplateColumn.CellTemplate >
<DataTemplate >
<sdk:Label Content="{Binding ID}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="Name" Width="100" >
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<sdk:Label Content="{Binding Name}" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
<sdk:DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel x:Name="spCollege" Width="300">
<sdk:DataGrid x:Name="dgCollege" Width="290" SelectionMode="Extended" RowDetailsVisibilityMode="VisibleWhenSelected" HeadersVisibility ="None" >
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn >
<sdk:DataGridTemplateColumn.CellTemplate >
<DataTemplate>
<Button x:Name="btn2"
Click="btn3_Click">
</Button>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="College" Text="{Binding College}" >
<sdk:DataGridTemplateColumn Header="Subjects" Text="{Binding Subjects}" >
</sdk:DataGrid.Columns>
<sdk:DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel x:Name="spSchool" Width="300" >
<sdk:DataGrid x:Name="dgSchool" Width="280" SelectionMode="Extended" RowDetailsVisibilityMode="VisibleWhenSelected" HeadersVisibility ="None">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Width="24">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button x:Name="btn" Height="15"
Click="btn3_Click">
</Button>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridTemplateColumn Header="School" Text="{Binding School}" >
<sdk:DataGridTemplateColumn Header="Subjects" Text="{Binding Subjects}" >
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</StackPanel>
</DataTemplate>
</sdk:DataGrid.RowDetailsTemplate>
</sdk:DataGrid>
private void btn1_Click(object sender, RoutedEventArgs e)
{
try
{
Button btnExpandCollapse = sender as Button;
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
// if we found the clicked row
if (dep != null && dep is DataGridRow)
{
DataGridRow row = (DataGridRow)dep;
// change the details visibility
if (row.DetailsVisibility == Visibility.Collapsed)
{
row.DetailsVisibility = Visibility.Visible;
}
else
{
row.DetailsVisibility = Visibility.Collapsed;
}
}
}
catch (System.Exception)
{
}
}
---------------------------------------
2 datagrid
private void btn2_Click(object sender, RoutedEventArgs e)
{
try
{
Button btnExpandCollapse = sender as Button;
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
if (dep != null && dep is DataGridRow)
{
DataGridRow row = (DataGridRow)dep;
// change the details visibility
if (row.DetailsVisibility == Visibility.Collapsed)
{
row.DetailsVisibility = Visibility.Visible;
}
else
{
row.DetailsVisibility = Visibility.Collapsed;
}
}
}
catch (System.Exception)
{
}
}
-----------------
3 datagrid
private void btn1_Click(object sender, RoutedEventArgs e)
{
try
{
Button btnExpandCollapse = sender as Button;
DependencyObject dep = (DependencyObject)e.OriginalSource;
while ((dep != null) && !(dep is DataGridRow))
{
dep = VisualTreeHelper.GetParent(dep);
}
// if we found the clicked row
if (dep != null && dep is DataGridRow)
{
DataGridRow row = (DataGridRow)dep;
// change the details visibility
if (row.DetailsVisibility == Visibility.Collapsed)
{
row.DetailsVisibility = Visibility.Visible;
}
else
{
row.DetailsVisibility = Visibility.Collapsed;
}
}
}
catch (System.Exception)
{
}
}
答案 0 :(得分:1)
答案 1 :(得分:0)
这显然是SL网格中的一个错误。在用户在第二级网格中折叠一行后,我能够通过快速关闭并重新打开父RowDetailsTemplate来解决这个问题:
void secondLevelGrid_RowDetailsVisibilityChanged(object sender, DataGridRowDetailsEventArgs e)
{
if (e.Row.DetailsVisibility == Visibility.Visible) return;
var parentRow = this.GetVisualAncestors().OfType<DataGridRow>().FirstOrDefault();
parentRow.DetailsVisibility = Visibility.Collapsed;
var timer = new DispatcherTimer() { Interval = new TimeSpan(0, 0, 0, 0, 200) };
timer.Tick += (ts, te) =>
{
Dispatcher.BeginInvoke(() => parentRow.DetailsVisibility = Visibility.Visible);
timer.Stop();
};
timer.Start();
}
当父行重新打开时,仍会选择第二级网格中的正确行,因此在视觉上可以创建相当无缝的体验。