找回密码
 立即注册

QQ登录

只需一步,快速开始

withsmile

初级会员

21

主题

50

帖子

319

积分

初级会员

积分
319

活字格认证

withsmile
初级会员   /  发表于:2014-8-7 16:29  /   查看:8349  /  回复:5
对左右两个单元格设置DataMap,左边是Dictionary<string, string>,右边是Dictionary<int, string>

  1. void PopupQuery_Load(object sender, EventArgs e)
  2. {
  3.      Dictionary<string, string> dic_string;
  4.                  dic_string.Add("1", "值1");
  5.                  dic_string.Add("2", "值2");
  6.      Dictionary<int, string> dic_int;
  7.                  dic_int.Add(1, "值1");
  8.                  dic_int.Add(2, "值2");
  9.      CellStyle cs1 = c1FlexGridQuery.Styles.Add("Combo1");
  10.                  cs1 .DataType = typeof(string);
  11.                  cs1 .DataMap = dic_string;
  12.      CellStyle cs2 = c1FlexGridQuery.Styles.Add("Combo2");
  13.                  cs2 .DataType = typeof(string);
  14.                  cs2 .DataMap = dic_int;
  15.      c1FlexGridQuery.SetCellStyle(1,1, cs1 );
  16.      c1FlexGridQuery.SetCellStyle(1,2, cs2 );
  17. }
复制代码

在分别在两个单元格中选择下拉项目,
譬如我在左单元格选择了 “值1”,c1Label1调用GetDataDisplay并传值显示“值1”(TValue ),在右单元格选择了 “值2”,c1Label12调用GetDataDisplay并传值显示 2(TKey),而不是 “值2”(TValue) 。
  1. private void c1FlexGridQuery_CellChanged(object sender, RowColEventArgs e)
  2. {
  3.      c1Label1.Value =  c1FlexGridQuery.GetDataDisplay(1, 1);
  4.      c1Label2.Value =  c1FlexGridQuery.GetDataDisplay(1, 2);
  5. }
复制代码

为什么单元格DataMap在接受Dictionary<string,string>后,GetDataDisplay()方法显示的是TValue,
而在接受时Dictionary<int,string>后,GetDataDisplay()方法显示的是TKey ?

5 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2014-8-7 18:37:00
沙发
回复 1楼withsmile的帖子

C1FlexGrid可以在绑定到数据源时使用数据映射列,配备了Idictionary接口的任何一类都可以作为一个“数据映射”来使用。例如,Hashtable,ListDictionary和SortedList都提供了有效的数据映射。

“数据映射”属性包含一个IDictionary对象的引用,它在什么是存储在表格中的什么是用户可见的之间建立了一个映射(IDictionary接口界面是在系统中定义的。集合的命名空间是由哈希表之类实现的)。

例如,下面的代码可以创建一个的包含颜色值和他们的名字的数据映射。颜色存储于表格中,而向用户显示的是他们的名字:
  1. System.Collections.Hashtable dtMap = new System.Collections.Hashtable();
  2. dtMap.Add(Color.Red, &quot;Apple&quot;);
  3. dtMap.Add(Color.Green, &quot;Forest&quot;);
  4. dtMap.Add(Color.Blue, &quot;Sky&quot;);
  5. dtMap.Add(Color.Black, &quot;Coal&quot;);
  6. dtMap.Add(Color.White, &quot;Snow&quot;);
  7. _flex.Cols[1].DataType = typeof(Color);
  8. _flex.Cols[1].DataMap = dtMap;
复制代码


而GetDataDisplay方法可以得到展示的数据,所以你展示的是什么,得到的就是什么。
GetData方法可以得到实际存储的数据,展示数据和实际存储的数据是不一致的。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
withsmile
初级会员   /  发表于:2014-8-8 08:06:00
板凳
回复 2楼Alice的帖子

  1. 而GetDataDisplay方法可以得到展示的数据,所以你展示的是什么,得到的就是什么。
  2. GetData方法可以得到实际存储的数据,展示数据和实际存储的数据是不一致的。
复制代码

GetDataDisplay的运作原理,我明白了,但我还有一个问题。
为何单元格DataMap在接受Dictionary<string,string>后,会展示TValue,
而在接受Dictionary<int,string>后,会展示TKey?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-8-8 10:17:00
地板
回复 3楼withsmile的帖子

FlexGrid展示的是TValue, 由GetDataDisplay方法获取。存下去的是TKey,由GetData方法获取。
不管<string,string>还是<int, string>都一样。
但你设置了DataType,注意我2楼代码设置的DataType,是将TKey设给了DataType,就声明了单元格的存储类型是TKey。
但你的代码:cs2 .DataType = typeof(string);
将数据类型设置为了string,这是TValue的类型。默认是应该存储Tkey的类型。这样子你要求存储的值是TValue,并且展示的也是TValue,它就会尝试做类型的转换。如果转换失败值会为null。

所以这句代码应该改成,cs2.DataType=typof(int)或是删除掉。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
withsmile
初级会员   /  发表于:2014-8-8 11:08:00
5#
回复 4楼Alice的帖子

多谢提点,茅塞顿开。:strong:
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2014-8-8 14:59:00
6#
回复 5楼withsmile的帖子

不用客气。

评分

参与人数 1满意度 +5 收起 理由
withsmile + 5 谢谢,问题解决。

查看全部评分

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

葡萄城控件服务团队

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