C1 FlexGrid控件 Editor 冲突问题
当给C1FlexGrid控件加入 Checkbox后,添加新行时对新行的Editor 赋新控件时,会冲突如下图:
下面我们借助BeforeRowColChange 事件来解决这个问题:
我理解的此事件是当前鼠标选择中单元格发生改变时触发。(可能会涉及到多选择单元格的情况 ,因本需要不涉及上问题,所以此文章只做参考)
首先我先说一下思路
1、创建一个Dictionary<int, Control> 的对象 , int: 记录行号, Control:记录当前行把拥有的Editor。
2、当C1FlexGrid初始加载完成后,循环把 C1FlexGrid 中每行的Editor 缓存到第1步创建的对象中。(因为后面我会清楚掉C1FlexGrid的行Editor,我们会用此缓存把数据在还原回去)
3、BeforeRowColChange 事件中判断是否清楚清C1FlexGrid的行Editor代码如下 。
创建缓存对象:
private Dictionary<int, Control> dic = new Dictionary<int, Control>(); //缓存FlexGrid中的Editor控件 用于解决CheckBox不冲突问题
加载数据完成后,记录缓存
Column cl = c1FlexGrid1.Cols.Add(); cl.Caption = "多选"; cl.Name = "duoxuan"; cl.DataType = typeof(Boolean); cl.AllowEditing = true; //CheckBox ccc = new CheckBox(); //cl.Editor = ccc; ComboBox cb = new ComboBox(); cb.Items.Add("1"); cb.Items.Add("2"); cl = c1FlexGrid1.Cols.Add(); cl.Caption = "时间"; cl.Name = "shijian"; cl.AllowEditing = true; //cl.Editor = cb; DateTimePicker dtp = new DateTimePicker(); Row row = c1FlexGrid1.Rows.Add(); row[1] = "true"; row.Editor = dtp; row = c1FlexGrid1.Rows.Add(); row[1] = "true"; row.Editor = cb; //缓存数据到 缓存对象中 foreach (Row r in c1FlexGrid1.Rows) { dic.Add(r.Index, r.Editor); }
BeforeRowColChange事件
private void c1FlexGrid1_BeforeRowColChange(object sender, RangeEventArgs e) { if (e.NewRange.c1 == 1) { c1FlexGrid1.Rows[e.NewRange.TopRow].Editor = null; } if (e.NewRange.c1 == 2) { KeyValuePair<int, Control> row = dic.Where(o => o.Key == e.NewRange.TopRow).FirstOrDefault(); if (!row.Equals(null)) { c1FlexGrid1.Rows[e.NewRange.TopRow].Editor = row.Value; } } }
这样就可以解决了,如果还有什么疑问,可以留言。