C1介绍
上篇《UI_ComponentOne使用简介》对C1控件的常用操作进行了简要介绍,本篇讲继续对C1控件的高级操作进行研究,进行经验总结。
C1高级操作指南
1. 相同行合并
第一种方法是通过C1高级选项控制
总的C1控件设置
分列合并设置
当 AllowMerging 直接设为True 时,所有 每行所有相同的字段信息都会合并。
如下图,但是与我们的实际期望的不符,我们按照PTO代码+参数名称区分每一组数据的,就是希望即时PTO代码或其他产品线等信息相同也不合并,而是依据计划类别进行分组合并。
在代码中加入this.fgResult.AllowMerging = AllowMergingEnum.RestrictCols; 这句话的本身的意思按照C1列从左至右,按照最多合并项进行合并。比如下图,列从左至右,到参数分为2组,则前面一样的字段信息,比如产品线,大类,Pto代码等按照2组进行分类。然后再从左往右进行,计划类别,每组数据再次分为15小组,则后面的数据均按照这15小组进行数据合并。这样就有效区分每条数据具体包含的范围,而不像上图1全部合并。
第二种方法是增加空行的方法进行分组
组合数据按照要求进行分组,AllowMerging 用默认设置Free的情况下,也可以通过在组建的C1控件依据规则增加空行的形式进行。但要采用空行的情况下,在输出数据的时候,应该空行隐藏。
dtResult = this.AddNullRow(dtResult);
// 空行隐藏
if (i % stepLength == 1)
{
this.fgResult.Rows[i].Visible = false;
}
/// <summary>
/// 没隔STEP行添加一个空行
/// </summary>
/// <param></param>
/// <returns></returns>
private DataTable AddNullRow(DataTable dtSource)
{
int intTime = 0;
int stepLength = 9;
DataTable dtCopy = dtSource.Copy();
for (int i = 0; i < dtResult.Rows.Count; i++)
{
if (i % stepLength == 0)
{
DataRow nullRow = dtCopy.NewRow();
dtCopy.Rows.InsertAt(nullRow, i + intTime);
intTime++;
}
}
return dtCopy;
}
2. C1的列与具体的控件属性和方法关联
C1的列编辑器有一个很有趣的设定,就是它可以把当前行的Cell与页面的某一个控件,比如Label,Textbox,Button等建立关联,以实现个性化的需求。
它通过Editor属性进行设置和实现。
上图为姓名列信息与Label关联,则点击该Cell,C1会自动把该Cell的内容放到Label里面,这样Label的各种属性和方法该Cell都可以利用到了。
上图 是地址的列与Textbox控件关联的。
上图是地址的列与Textbox控件关联的。但Textbox控件属性设为不可用,所以选中该Cell时对应的不可用的灰框。
上图是教育与Button关联。双击该Cell,则在Button弹出对话框。
3. C1的行RowsCols列的编辑性设置
//总体可以编辑
c1FlexGrid1.AllowEditing = true;
//设置某些列不可编辑
c1FlexGrid1.Cols["BIRTHDAY"].AllowEditing = false;
c1FlexGrid1.Cols["FULL_NAME"].AllowEditing = false;
//设置某些行不可编辑
c1FlexGrid1.Rows[2].AllowEditing = false;
c1FlexGrid1.Rows[4].AllowEditing = false;
c1FlexGrid1.Rows[5].AllowEditing = true;
C1控件的是否可编辑的设置的原则,是false大于true。比如上述设置两个列为只读,则即使某一行设为可以编辑,此时这一行的这一列也无法编辑保持只读。同样,当某一行设为只读是,即使该有列设为可以读写,该行依然是只读的。
4. C1的Cell的编辑性设置
上述而言,C1的编辑性是限制到行和列的,不能对某个Cell进行是否可以编辑进行设置。这是如果还需要对某个Cell进行可编辑进行限制。这时候有两种方法。
第一种方法,在Cell的设置自定义的只读属性的Style 。
//Cell设为只读的Style
CellStyle labelstype = c1FlexGrid1.Styles.Add("ReadOnly");
labelstype.Editor = label1;
//设置第6行的第6列到第8列为只读,就是把该CellRange的Style设置为自定义的Style 即可
CellRange cr = c1FlexGrid1.GetCellRange(6, 6, 6, 8);
cr.Style = labelstype;
第二种方法,是在C1控件的BeforeEdit事件增加判断,判断满足条件的Cell,将其修改事件的效果改为Cancel即可。
private void c1FlexGrid1_BeforeEdit(object sender, RowColEventArgs e)
{
//设置第-9行的第列不可编辑
if ((e.Row >= 7 && e.Row <= 9) && (e.Col == 7))
{
e.Cancel = true;
}
}
5. C1的Style设定
灵活运用Style,可以得到比较好的用户体验效果。
//定义字体
Font font1 = new Font("Microsoft YaHei", 9, FontStyle.Italic);
//定义Syle
CellStyle styleCustom = c1FlexGrid1.Styles.Add("Custom");
styleCustom.BackColor = Color.BlueViolet;
styleCustom.ForeColor = Color.Yellow;
styleCustom.Font = font1;
//设置Style
CellRange cr2 = c1FlexGrid1.GetCellRange(10, 6, 10, 8);
cr2.Style = styleCustom;
效果如下:
6. C1的BeforeEdit,ValidateEdit,AfterEdit的区别和作用
C1中BeforeEdit,ValidateEdit,AfterEdit三个事件函数主要对C1的数据进行过滤和控制,三者既有联系又有区别。要详细区分三者的使用场景。
//事件触发时,该Cell的值[原始值],
c1FlexGrid1[e.Row, e.Col].ToString()
//事件触发时,编辑区的值[修改值]
c1FlexGrid1.Editor.Text
BeforeEdit
ValidateEdit
AfterEdit
以上抓图可以看出不同事件触发时,c1FlexGrid1[e.Row, e.Col].ToString()的取值是不同的。e.Cancel = true 的效果也不同。
BeforeEdit 是预先判断的,它的判断依据是Cell的原始值,如果此时e.Cancel = true时,则起到Cell是只读的效果。
ValidateEdit 可以得到Cell的原始值和修改后的值。我们可以依据修改后的值进行业务规则判断,比如大于0或小于0,直接提示用户。使用了e.Cancel = true后,事件不通过,必须Cell放弃当前修改或修改成正确值才可以。
AfterEdit,仅能得到修改后的值,但可以通过此值依据业务规则进行运算,以期实现Cell的数值互动。比如计算录入该Cell值后,统计该行或列的数据。
7. C1的图形控件
结合C1Chart控件,可以把数据表的数据信息转换成图形的样式,加深信息的理解。如下图显示的几个物料的总数量和安全库存的对比分析。
8. C1的其他常用属性
//当前行,用于双击或单击某一行数据获取的行Index
c1FlexGrid1.RowSel
//当前选中Cell
c1FlexGrid1[c1FlexGrid1.Selection.r1, c1FlexGrid1.Selection.c1]
//事件中,当前Cell
c1FlexGrid1[e.Row, e.Col]
参考书目
1. ComponentOne Studio Enterprise 帮助文档