安心海叶 发表于 2016-8-15 11:03:13

C1DataGrid问题

您好!

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

Alice 发表于 2016-8-15 11:18:49

如果是给ColumnHeader添加CombBox,使用模板列设置header就可以,代码参考:
<c1:C1DataGrid.Columns>
                <c1:DataGridTemplateColumn>
                  <c1:DataGridTemplateColumn.Header>
                        <ComboBox></ComboBox>
                  </c1:DataGridTemplateColumn.Header>
                </c1:DataGridTemplateColumn>
            </c1:C1DataGrid.Columns>
ComboBox本身也可以挂相关的事件,发生改变的时候去做更改。

有关列显示内容改变的这个需求。列头本身也提供了Filter属性,可以做过滤,您可以看看过滤是否可以满足您的需求。
过滤请参考产品随机安装示例:\Documents\ComponentOne Samples\WPF\C1.WPF.DataGrid\CS\DataGridSamples

安心海叶 发表于 2016-8-15 14:38:57

Alice 发表于 2016-8-15 11:18
如果是给ColumnHeader添加CombBox,使用模板列设置header就可以,代码参考:

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

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





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

安心海叶 发表于 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

安心海叶 发表于 2016-8-15 16:28
如果右键点击Champion,出现下拉菜单列表Champion,Runner-up,Third,Fourth,这种方式DataGrid可以实现 ...

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

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

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

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

安心海叶 发表于 2016-8-16 16:47:44

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

安心海叶 发表于 2016-8-16 16:47
请问,如果右键点击Champion,出现下拉菜单列表Champion,Runner-up,Third,Fourth,当不想显示Third时 ...

可以,通过Column.Visibility属性来设置不可见。
datagrid.Columns.Visibility = Visibility.Collapsed;

安心海叶 发表于 2016-8-17 09:43:18

Alice 发表于 2016-8-16 17:14
可以,通过Column.Visibility属性来设置不可见。

我想知道的是:如何右键点击指定Header,出现下拉菜单,操作当前列,因为DataGrid好像没有HitTest属性,也没有CellType属性

Alice 发表于 2016-8-17 15:44:48

安心海叶 发表于 2016-8-17 09:43
我想知道的是:如何右键点击指定Header,出现下拉菜单,操作当前列,因为DataGrid好像没有HitTest属性, ...

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

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

      }

安心海叶 发表于 2016-8-22 15:01:40

Alice 发表于 2016-8-17 15:44
这是业务逻辑的问题。
右键菜单就是通过鼠标的相关事件可以添加。
如何判断点击的是行,还是Header, W ...

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

功能已经实现,O(∩_∩)O谢谢
页: [1] 2
查看完整版本: C1DataGrid问题