在实际使用用DEV XtraGrid开发中,我们经常会遇到需要将绑定列与非绑定列一起显示在一个GridView上面。我们知道使用VS自带的DataGridView是不能直接实现这个功能的,那么,我们应该如何使用XtraGrid来实现这个功能?
首先,我们来看看效果图,如下图:
在上图中,ID、Name、Age、Salary是数据库中已有的字段,而Total—Expression和Total是绑定的非绑定列。在这里我想介绍XtraGrid中绑定非绑定列的两个方法:使用XtraGrid里面的表达式方法和使用CustomUnboundColumnData事件的方法!
一、 使用XtraGrid里面的表达式
该方法非常的简单,主要适合非绑定列数据可以直接通过绑定列计算得出的情况,代码如下:
//创建一非绑定列
GridColumn columnExtPrice = new GridColumn();
columnExtPrice.FieldName = "Total-Expression";
columnExtPrice.Caption = "Total-Expression";
//关键代码
columnExtPrice.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
//设置计算表达式
columnExtPrice.UnboundExpression = "[Age] * [Salary] ";
gridView1.Columns.Add(columnExtPrice);
columnExtPrice.VisibleIndex = gridView1.Columns.Count;
//设置字符格式
columnExtPrice.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
columnExtPrice.DisplayFormat.FormatString = "c";
有上述代码可看出,Total-Expression的计算公式为对应行中Age与Salary的乘积。大家可以看出,该方法非常简单实用。
下面我们再来看看第二种方法:使用CustomUnboundColumnData事件。使用事件的方式同样很简单,但是它的适用情况更广。
首先我们根据具体的情况编写计算方法:我这里计算方法是对应行的Age×Salary×ID;
//计算方法
decimal getTotalValue(ColumnView view, int listSourceRowIndex)
{
DataRow row = test01DataSet.Tables["EMP"].Rows[listSourceRowIndex];
int age = Convert.ToInt16(row["Age"]);
decimal salary = Convert.ToDecimal(row["Salary"]);
int ID = Convert.ToInt16(row["ID"]);
return age * salary * ID;
}
然后,在窗体Load事件里面添加新列:Total,代码如下:
//创建一非绑定列
GridColumn unbColumn = gridView1.Columns.AddField("Total");
unbColumn.VisibleIndex = gridView1.Columns.Count;
unbColumn.UnboundType = DevExpress.Data.UnboundColumnType.Decimal;
//设置可编辑
unbColumn.OptionsColumn.AllowEdit = false;
//设置字符格式
unbColumn.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
unbColumn.DisplayFormat.FormatString = "c";
//外观设置
unbColumn.AppearanceCell.BackColor = Color.LemonChiffon;
最后在CustomUnboundColumnData事件处理程序中实现非绑定列的绑定,代码如下:
private void gridView1_CustomUnboundColumnData(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDataEventArgs e)
{
//当列的字段名为Total的时候,给事件参数e的Value属性赋值。
if (e.Column.FieldName == "Total" && e.IsGetData)
e.Value =getTotalValue(sender as ColumnView, e.ListSourceRowIndex);
}
实现非绑定列的两种方法就介绍给大家了,总的来说:
1. 两种方法的实现都比较简单。
2. 使用事件的方法比使用表达式的方法更加灵活,使用范围更广。
3. 在表达式的编写中,可以直接调用常见的数学函数以及逻辑运算符等。