找回密码
 立即注册

QQ登录

只需一步,快速开始

[已处理] 列表单元格合并

来爱清
论坛元老   /  发表于:2015-3-27 14:57  /   查看:8335  /  回复:7
在列表上动态绑定N条数据(如下图苹果、香蕉、橘子……),每条数据均含有4组子项(如下图中A、B、C、D……)
1.这种格式的动态列表C1DataGrid支持吗?有没有Demo?
2.如果设置某几列为可编辑(如下图单价、保质期),其余几列为只读,可以吗?

本帖子中包含更多资源

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

x

7 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2015-3-27 18:13:00
沙发
回复 1楼来爱清的帖子

1.请问你说的是C1DataGrid的动态绑定么?
我这里没有Demo,但帮你找了基本的解决思路和相关代码。
第一步:假设一个数据源,里面有FirstName和LastName两列:
  1. public class Property : INotifyPropertyChanged
  2.     {
  3.         public Property(string name, object value)
  4.         {
  5.             Name = name;
  6.             Value = value;
  7.         }

  8.         public string Name { get; private set; }
  9.         public object Value { get; set; }

  10.         public event PropertyChangedEventHandler PropertyChanged;
  11.     }
  12.     public class Record
  13.     {
  14.         private readonly ObservableCollection<Property> properties = new ObservableCollection<Property>();

  15.         public Record(params Property[] properties)
  16.         {
  17.             foreach (var property in properties)
  18.                 Properties.Add(property);
  19.         }

  20.         public ObservableCollection<Property> Properties
  21.         {
  22.             get { return properties; }
  23.         }
  24.     }
复制代码


第二步:XMAL的代码绑定数据源应该这样写:
  1. <c1:C1DataGrid  AutoGenerateColumns="false"    ItemsSource="{Binding Path=Records}" />
复制代码


第三步:初始化数据,然后动态绑定列:
  1. var records = new ObservableCollection<Record>();
  2.             records.Add(new Record(new Property("FirstName", "Paul"), new Property("LastName", "Stovell")));
  3.             records.Add(new Record(new Property("FirstName", "Tony"), new Property("LastName", "Black")));

  4.             var columns = records.First()
  5.     .Properties
  6.     .Select((x, i) => new { Name = x.Name, Index = i })
  7.     .ToArray();

  8.             foreach (var column in columns)
  9.             {
  10.                 var binding = new Binding(string.Format("Properties[{0}].Value", column.Index));
  11.                 C1.WPF.DataGrid.DataGridTextColumn textColumn = new C1.WPF.DataGrid.DataGridTextColumn();
  12.                 textColumn.Header = column.Name;
  13.                 textColumn.Binding = binding;
  14.                 this.c1DataGrid1.Columns.Add(textColumn);
  15.             }
复制代码


2.可以在XAML代码中通过IsReadOnly属性设置为只读。
  1. <c1:DataGridTextColumn Header="规则名称" Binding="{Binding RULE_NAME, Mode=TwoWay}"    IsReadOnly="True" />

  2.                 <c1:DataGridNumericColumn Header="问题单据数" Binding="{Binding EXP_ORD_COUNT, Mode=TwoWay}" SortMemberPath="EXP_ORD_COUNT" IsReadOnly="False"/>
复制代码
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2015-3-27 22:38:00
板凳
是这种单元格合并的效果如何实现?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-3-30 09:23:00
地板
回复 3楼来爱清的帖子

有关单元格合并可以利用MergeHelper。
我这里有一个示例,供你参考:

本帖子中包含更多资源

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

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

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2015-3-30 21:00:00
5#
示例很强大:strong:  
现在有3个细节问题请教下:
1.示例中是自动合并某一列中值相同的行,包括空白值行。如果不希望某一列被合并,如何处理(如下图“单价”一列)?
2.如果希望某一列中每4行合并一次,如下图&quot;保质期&quot;列,如何处理?
3.如何横向合并单元格,即下图中“按实际核算”形式的单元格?

本帖子中包含更多资源

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

x
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-3-31 10:20:00
6#
回复 5楼来爱清的帖子

1.Merge不是自动的,是通过MergeCells事件里调用e.Merge方法传入一个区域实现的。
你可以在该事件里根据需求去判断,如果MergeRange不是单价列,就执行合并操作,否则就不合并即可。

2.和第一个问题一样的,你需要合并什么内容,你在e.Merge方法的区域里就传入你想合并的区域即可。这个方法里的区域可以是任意的。传入topleft和bottomright位置的单元格即可。

3.可以。给方法穿参数的时候,传入最左边单元格和最右边单元格即可。

评分

参与人数 1满意度 +5 收起 理由
来爱清 + 5 问题已解决,谢谢

查看全部评分

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

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2015-3-31 17:46:00
7#
问题已解决,谢谢
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-4-1 08:45:00
8#
回复 7楼来爱清的帖子

不用客气。
解决就好:)
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部