找回密码
 立即注册

QQ登录

只需一步,快速开始

安心海叶

中级会员

66

主题

255

帖子

717

积分

中级会员

积分
717

活字格认证微信认证勋章

安心海叶
中级会员   /  发表于:2016-8-15 11:03  /   查看:6366  /  回复:10
您好!

        现在我想定义DataGrid某一列的Header为Combox。
        DataGrid的Header为2行,只需Header的第2行为Combox,当Combox的选择项改变时,当前列的显示内容改变,该如何实现?

10 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2016-8-15 11:18:49
沙发
如果是给ColumnHeader添加CombBox,使用模板列设置header就可以,代码参考:
  1.   <c1:C1DataGrid.Columns>
  2.                 <c1:DataGridTemplateColumn>
  3.                     <c1:DataGridTemplateColumn.Header>
  4.                         <ComboBox></ComboBox>
  5.                     </c1:DataGridTemplateColumn.Header>
  6.                 </c1:DataGridTemplateColumn>
  7.             </c1:C1DataGrid.Columns>
复制代码

ComboBox本身也可以挂相关的事件,发生改变的时候去做更改。

有关列显示内容改变的这个需求。列头本身也提供了Filter属性,可以做过滤,您可以看看过滤是否可以满足您的需求。
过滤请参考产品随机安装示例:\Documents\ComponentOne Samples\WPF\C1.WPF.DataGrid\CS\DataGridSamples
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
安心海叶
中级会员   /  发表于:2016-8-15 14:38:57
板凳
Alice 发表于 2016-8-15 11:18
如果是给ColumnHeader添加CombBox,使用模板列设置header就可以,代码参考:

ComboBox本身也可以挂相关 ...

谢谢您的回复。
但仍需您的帮助~~~





像图片红色Champion头,如果定义为Combox,内容包括Champion,Runner-up,Third,Fourth,选择不同的显示内容,列的数据更新。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
安心海叶
中级会员   /  发表于:2016-8-15 16:28:48
地板
Alice 发表于 2016-8-15 11:18
如果是给ColumnHeader添加CombBox,使用模板列设置header就可以,代码参考:

ComboBox本身也可以挂相关 ...

如果右键点击Champion,出现下拉菜单列表Champion,Runner-up,Third,Fourth,这种方式DataGrid可以实现吗?

回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-8-15 17:24:11
5#
安心海叶 发表于 2016-8-15 16:28
如果右键点击Champion,出现下拉菜单列表Champion,Runner-up,Third,Fourth,这种方式DataGrid可以实现 ...

从我的理解来说,你是需要动态的调换列?
你希望在运行时候,根据选择动态的将列1改成列2,列2改成列3?

如果是这样,你的业务逻辑有两部分,一部分就是在列头添加ComboBox,另一部分就是运行时的动态更改列的位置。

第一部分:既然是给Champion列设置ComboBox,那么你程序里的合并是不合适的,因为列头的单元格类型都不一样,就不支持默认的合并方式。
所以XAML部分的代码建议改成
  1. <c1:DataGridTextColumn  Binding="{Binding First}" >
  2.                     <c1:DataGridTextColumn.Header>
  3.                         <ComboBox SelectedIndex="0" SelectionChanged="ComboBox_SelectionChanged">
  4.                             <ComboBoxItem>Champion</ComboBoxItem>
  5.                             <ComboBoxItem>Runner-up</ComboBoxItem>
  6.                             <ComboBoxItem>Third</ComboBoxItem>
  7.                             <ComboBoxItem>Fourth</ComboBoxItem>
  8.                         </ComboBox>
  9.                     </c1:DataGridTextColumn.Header>
复制代码


第二部分的逻辑就写在ComboBox_SelectionChanged中,如果是简单的更改列位置,使用DisplayIndex属性(grid.Columns[2].DisplayIndex = 3;)
代码参考:
  1. private void ComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
  2.         {
  3.             try
  4.             {
  5.                 object obj = (object)e.AddedItems;
  6. //获取ComboBox显示的字符
  7.                 string str = Convert.ToString(((System.Data.DataRowView)(((object[])(obj))[0])).Row.ItemArray[1]);
  8.                 if (str.Equals("Runner-up"))
  9.                 {
  10.                     //执行业务逻辑
  11.                 }               
  12.             }
  13.             catch (Exception)
  14.             {
  15.                 throw;
  16.             }
复制代码

请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
安心海叶
中级会员   /  发表于:2016-8-16 16:47:44
6#
Alice 发表于 2016-8-15 17:24
从我的理解来说,你是需要动态的调换列?
你希望在运行时候,根据选择动态的将列1改成列2,列2改成列3? ...

请问,如果右键点击Champion,出现下拉菜单列表Champion,Runner-up,Third,Fourth,当不想显示Third时,将其隐藏,这种方式DataGrid可以实现吗?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-8-16 17:14:18
7#
安心海叶 发表于 2016-8-16 16:47
请问,如果右键点击Champion,出现下拉菜单列表Champion,Runner-up,Third,Fourth,当不想显示Third时 ...

可以,通过Column.Visibility属性来设置不可见。
  1. datagrid.Columns[0].Visibility = Visibility.Collapsed;
复制代码
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
安心海叶
中级会员   /  发表于:2016-8-17 09:43:18
8#
Alice 发表于 2016-8-16 17:14
可以,通过Column.Visibility属性来设置不可见。

我想知道的是:如何右键点击指定Header,出现下拉菜单,操作当前列,因为DataGrid好像没有HitTest属性,也没有CellType属性
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2016-8-17 15:44:48
9#
安心海叶 发表于 2016-8-17 09:43
我想知道的是:如何右键点击指定Header,出现下拉菜单,操作当前列,因为DataGrid好像没有HitTest属性, ...

这是业务逻辑的问题。
右键菜单就是通过鼠标的相关事件可以添加。
如何判断点击的是行,还是Header, WPF的事件是可以获取到触发事件的来源的。
代码参考:
  1.        void grid_LoadedColumnHeaderPresenter(object sender, C1.WPF.DataGrid.DataGridColumnEventArgs e)
  2.         {
  3.             e.Column.HeaderPresenter.MouseRightButtonDown += HeaderPresenter_MouseRightButtonDown;
  4.          }

  5.         void HeaderPresenter_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
  6.         {
  7. //在这里判断,出现下拉菜单, sender可以拿到是什么触发的。e.GetPosition方法可以获取到坐标。这都是WPF的方法。

  8.         }
复制代码

请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
安心海叶
中级会员   /  发表于:2016-8-22 15:01:40
10#
Alice 发表于 2016-8-17 15:44
这是业务逻辑的问题。
右键菜单就是通过鼠标的相关事件可以添加。
如何判断点击的是行,还是Header, W ...

当列头合并时,不能用grid_LoadedColumnHeaderPresenter。

功能已经实现,O(∩_∩)O谢谢
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部