datagrid嵌套datagrid问题

gdgogo 2014-06-24 07:11:18

各位好, 我想实现如下界面,相当于三级表显示功能。(即datagrid包含datagrid包含label)。其中展开行细节RowDetails修改为是通过点击控件Expander实现。


我现在遇到两个问题,网上查了好久都没有解决,在这里请大家帮我看下。

问题一、当我展开行细节RowDetails后,鼠标停留在子datagrid上时,滚动鼠标滚轮无较。(估计是阻碍了事件路由冒泡)

问题二、两个datagrid我都想实现点击控件Expander展开行细节RowDetails功能。但是子datagrid中如果使用相同代码<Expander Expanded="Expander_Expanded" Collapsed="Expander_Collapsed"/>运行时,会有一个报错。(好像是什么东西没有创建。)


C#代码如下:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;//ObservableCollection命名空间
namespace DataGridInDataGrid
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
//题目类
class question
{
public Int32 questionID//题目ID号
{ get; set; }
public string questionName//题目名,比如:第1题或第2题等
{ get; set; }
public ObservableCollection<choseItem> choseItems//某题中"选项类"的集合,比如A-D
{ get; set; }
public question(Int32 _id, string _questionname, ObservableCollection<choseItem> _choseitems)//构造函数
{
questionID = _id;
questionName = _questionname;
choseItems = _choseitems;
}
}
//选项类
class choseItem
{
public string ChoseName//选项名,比如:A,B,C,D之类
{ get; set; }
public string ChoseContent//选项内容
{ get; set; }
}
ObservableCollection<question> Questions = new ObservableCollection<question>();//题目数组
private void Window_Loaded(object sender, RoutedEventArgs e)
{
string[] CharStr = new string[4] { "A", "B", "C", "D" };
for (int i = 0; i < 100; i++)
{
ObservableCollection<choseItem> ChoseItems = new ObservableCollection<choseItem>();//选项数组
for (int j = 0; j < 4; j++)
{
choseItem item = new choseItem();//选项类
item.ChoseName = CharStr[j] + ":";
item.ChoseContent = "选项内容举例...";
ChoseItems.Add(item);
}
Questions.Add(new question(i, "__第" + (i + 1).ToString() + "题", ChoseItems));
}
datagrid1.ItemsSource = Questions;
}

private void Expander_Expanded(object sender, RoutedEventArgs e)
{
DataGridRow row = FindVisualParent<DataGridRow>(sender as Expander);
if (row != null) row.DetailsVisibility = System.Windows.Visibility.Visible;
}
private void Expander_Collapsed(object sender, RoutedEventArgs e)
{
DataGridRow row = FindVisualParent<DataGridRow>(sender as Expander);
if (row != null) row.DetailsVisibility = System.Windows.Visibility.Collapsed;
}

public T FindVisualParent<T>(DependencyObject child) where T : DependencyObject
{
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
if (parentObject == null) return null;
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindVisualParent<T>(parentObject);
}
}
}


主界面代码

<Window x:Class="DataGridInDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataGridInDataGrid" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
<DataGrid AutoGenerateColumns="False" Name="datagrid1" RowDetailsVisibilityMode="Collapsed">
<DataGrid.Columns>
<DataGridTemplateColumn Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Expander Expanded="Expander_Expanded" Collapsed="Expander_Collapsed"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="ID值" IsReadOnly="True" Width="auto" Binding="{Binding questionID}" />
<DataGridTextColumn Header="题目" IsReadOnly="True" Width="500" Binding="{Binding questionName}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate >
<DataTemplate >
<DataGrid ItemsSource="{Binding choseItems}" AutoGenerateColumns="False"
Margin="30,20,0,20" RowDetailsVisibilityMode="Collapsed">
<DataGrid.Columns>
<DataGridTemplateColumn Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Expander Expanded="Expander_Expanded" Collapsed="Expander_Collapsed"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="选项名" Binding="{Binding ChoseName}" />
<DataGridTextColumn Header="选项内容举例" Binding="{Binding ChoseContent}"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate >
<DataTemplate >
<Label Content="提示" />
</DataTemplate >
</DataGrid.RowDetailsTemplate >
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
</Window>
...全文
210 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdgogo 2014-06-30
  • 打赏
  • 举报
回复
gdgogo 2014-06-27
  • 打赏
  • 举报
回复
第一个问题怎么解决?
exception92 2014-06-27
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
[quote=引用 2 楼 stdesve 的回复:]
第一个问题怎么解决?

在嵌套的DataGrid中触发 PreviewMouseWheel 想办法 获取最外层的DataGrid的ScrollViewer
然后调用它的ScrollToVerticalOffset,参数的话估计需要自己计算了。
给个链接,获取子元素,
http://blog.csdn.net/duanzi_peng/article/details/17094639[/quote]
自己写了一下,

exception92 2014-06-27
  • 打赏
  • 举报
回复
引用 2 楼 stdesve 的回复:
第一个问题怎么解决?
在嵌套的DataGrid中触发 PreviewMouseWheel 想办法 获取最外层的DataGrid的ScrollViewer 然后调用它的ScrollToVerticalOffset,参数的话估计需要自己计算了。 给个链接,获取子元素, http://blog.csdn.net/duanzi_peng/article/details/17094639
exception92 2014-06-25
  • 打赏
  • 举报
回复
1:不是阻止了,是本身都没有那个事件,没办法同时最外层的ScrollViewer滚动。 2:测试没问题。

8,736

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧