在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件

[删除(380066935@qq.com或微信通知)]

更好的阅读体验请查看原文:https://www.cnblogs.com/wuhuacong/archive/2023/07/19/17566150.html

在使用DevExpress的GridView的时候,我们为了方便,往往使用一些扩展函数,动态创建GridView列的编辑控件对象,然后我们可以灵活的对内容进行编辑或者使用一些弹出的对话框窗体进行处理内容的录入,本篇随笔就是介绍这一主题:在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件。

1、使用扩展函数动态创建列

我们创建列,为了绑定相应的数据源信息展示,一般指定列的名称和显示的列标题名称,如下是一个简单的列创建处理代码。

 grv.CreateColumn("Note", "备注说明");

如果赢绑定了数据源,我们也可以根据列的FieldName进行获得列的控制权,然后给它指定不同的编辑控件,如下所示。

gridview.Columns.ColumnByFieldName("Introduction").CreateMemoEdit();

上面的CreateMemoEdit()函数就是一个简单的扩展函数,用于创建一个备注列的处理,它的编辑器控件 RepositoryItemMemoEdit 的RepositoryItem 扩展对象。扩展函数如下所示的代码。

        /// <summary>
        /// 创建GridView的列编辑为MemoEdit
        /// </summary>
        /// <param name="gridColumn">GridColumn列对象</param>
        /// <returns></returns>
        public static RepositoryItemMemoEdit CreateMemoEdit(this GridColumn gridColumn)
        {
            RepositoryItemMemoEdit repositoryItem = new RepositoryItemMemoEdit
            {
                AutoHeight = false,
                LinesCount = 0
            };
            gridColumn.View.GridControl.RepositoryItems.Add(repositoryItem);
            gridColumn.ColumnEdit = repositoryItem;
            return repositoryItem;
        }

我们把它们(这些扩展函数)定义在不同的类文件中,使用静态类就可以了。例如对于GridControl和GridView的相关处理扩展函数,我们把它整理放在一个类文件中,定义各种方便使用的方法即可,如下所示。

对于一些简单的录入我们保留让他使用默认文本输入框即可,如下所示代码。

this.gridViewRequisition.CreateColumn("需求金额", "需求金额", 80);
this.gridViewRequisition.CreateColumn("采购数量", "采购数量", 80);
this.gridViewRequisition.CreateColumn("采购金额", "采购金额", 80);
this.gridViewRequisition.CreateColumn("库存数量", "库存数量", 80);
this.gridViewRequisition.CreateColumn("可用库存", "可用库存", 80);

当然,如果我们想获得对应列的一些特殊的处理,那么可以把获得的列对象,赋值给变量,然后进行相关的属性处理。

var colQuantity = grv.CreateColumn("Quantity", "销售数量");
colQuantity.AppearanceCell.BackColor = Color.Moccasin;
colQuantity.AppearanceCell.Options.UseBackColor = true;
colQuantity.CreateSpinEdit();

而对于一些特殊的列,如一些下拉列表的列,我们可以指定他们的下拉列表,可以是固定列表,也可以通过函数获取数据库的记录进行绑定处理,如下所示。

var purchaseType = this.gridViewRequisition.CreateColumn("采购类型", "采购类型", 80).CreateGridLookUpEdit();
var typeList = new List<CListItem>()
{
    new CListItem("正品"),
    new CListItem("样品"),
    new CListItem("免费")
};
purchaseType.BindDictItems(typeList, false);

而如果备注处理,嫌GridView里面输入太麻烦,可以使用弹出的对话框进行处理,如下代码所示。

var note = this.gridViewRequisition.CreateColumn("备注", "备注", 100).CreateButtonEdit();
note.EditValueChanging += (ss, ee) =>
{
    gridViewRequisition.SetFocusedRowCellValue("备注", ee.NewValue);
};
note.ButtonClick += (ss, ee) =>
{
    var dlg = new FrmShowTextEdit();
    dlg.FieldDefaultValue = gridViewRequisition.GetFocusedRowCellDisplayText("备注");
    dlg.FieldDisplayName = "备注";
    if (dlg.ShowDialog() == DialogResult.OK)
    {
        gridViewRequisition.SetFocusedRowCellValue("备注", dlg.ReturnValue);
    }
};

弹出界面如下所示。

或者有时候,我们使用一些其他的选择对话框,也是类似的处理方式。

gridview.Columns.ColumnByFieldName("Creator").CreateButtonEdit().ButtonClick += (object sender, ButtonPressedEventArgs e) =>
{
    FrmSelectCustomer dlg = new FrmSelectCustomer();
    if(dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        if(gridview.GetFocusedRow() == null)
        {
            gridview.AddNewRow();//如果首次则增加一行
        }
        gridview.SetFocusedRowCellValue("Creator", dlg.CustomerName);
    }
};

如一些列表,也可以使用LookupEdit的编辑控件进行处理选择的展示。

如果我们希望对列表的特定字段进行启用编辑,那么可以利用下面扩展函数方式实现。

//设置只读、可编辑字段
this.gridViewAmount.SetColumnsReadOnly("*", false);
this.gridViewAmount.SetColumnsReadOnly("序列,采购类型,需求量,备注", true);

如果需要指定特定的汇总字段,可以通过下面代码实现。

// 设置统计字段
if (gridViewAmount?.Columns.Count > 0)
{
    gridViewAmount.ClearSummaryColumns();
    gridViewAmount.SetSummaryColumn("采购数量", DevExpress.Data.SummaryItemType.Sum);
}

 

 2、列内容的格式处理

在上面动态创建的列编辑控件,对于编辑的值发生变化,需要及时的反映到实际的列表对应的单元格的值中,一般在事件EditValueChanging 中通过SetFocusedRowCellValue 就可以设置回去了,如下代码所示。

var note = this.gridViewRequisition.CreateColumn("备注", "备注", 100).CreateButtonEdit();
note.EditValueChanging += (ss, ee) =>
{
    gridViewRequisition.SetFocusedRowCellValue("备注", ee.NewValue);
};

而对于一些数值型的内容处理,如SpinEdit的编辑器控件,那么每次输入一个不同的字符都会触发这个处理,那么就有点不正常的了,因此可以通过下面的方式进行矫正,利用EditValueChanged事件的处理。

            var xuqiuLiang = this.gridViewRequisition.CreateColumn("需求数量", "需求数量", 80).CreateSpinEdit();
            xuqiuLiang.ValidateOnEnterKey = true;
            xuqiuLiang.EditValueChanged += async (ss, ee) =>
            {
                var value = ((ss) as SpinEdit).Value;
                this.gridViewRequisition.SetFocusedRowCellValue("需求数量", value);               //刷新显示
                gridViewRequisition.RefreshRow(gridViewRequisition.FocusedRowHandle);
            };

上面的代码,通过把对应的当前控件转换为编辑器控件,获得值再行处理也是可以的。

另外,有时候,如果列的内容变更了,我们需要及时刷新指定列表行的内容,可以通过下面的代码实现的。

gridViewRequisition.RefreshRow(gridViewRequisition.FocusedRowHandle);

对于一些列表,需要给它指定删除的操作,方便移除整条记录,那么为它添加删除键即可,如下代码所示。

//行删除操作
this.gridViewRequisition.OptionsBehavior.AllowDeleteRows = DefaultBoolean.True;
this.gridViewRequisition.KeyDown += (s, ee) =>
{
    if (ee.KeyCode == Keys.Delete)
    {//移除记录
        gridViewRequisition.DeleteRow(gridViewRequisition.FocusedRowHandle);
        gridViewRequisition.RefreshData();

        ee.Handled = true;
    }
};

而对于列的一些格式转义操作,我们可以统一处理,可以把几个不同的GridView的转义函数放在一起。

//统一处理转义信息
this.gridViewRequisition.CustomColumnDisplayText += CustomColumnDisplayText;
this.gridViewSubx.CustomColumnDisplayText += CustomColumnDisplayText;
this.gridViewSpecification.CustomColumnDisplayText += CustomColumnDisplayText;

转义一般对日期的格式和数值型的格式进行一些格式化处理,如下代码所示。

        private void CustomColumnDisplayText(object sender, CustomColumnDisplayTextEventArgs e)
        {
            string columnName = e.Column.FieldName;
            if (e.Column.ColumnType == typeof(DateTime) || e.Column.ColumnType == typeof(DateTime?))
            {
                if (e.Value != null)
                {
                    if (e.Value == DBNull.Value || Convert.ToDateTime(e.Value) <= Convert.ToDateTime("1900-1-1"))
                    {
                        e.DisplayText = "";
                    }
                    else
                    {
                        e.DisplayText = Convert.ToDateTime(e.Value).ToString("yyyy-MM-dd HH:mm");//yyyy-MM-dd
                    }
                }
            }
            else if (e.Column.ColumnType == typeof(decimal) || e.Column.ColumnType == typeof(decimal?))
            {
                decimal value;
                if (decimal.TryParse(e.DisplayText, out value))
                {
                    e.DisplayText = value.ToString("0.################");
                }
            }
        }

而如果喜欢对列的背景色等进行自定义,可以在事件RowCellStyle中,根据不同的字段名称进行处理。

this.gridViewSpecification.RowCellStyle += (s, e) =>
{
    e.Appearance.BackColor = Color.Transparent;
    if (e.Column.FieldName == "序列")
    {
        var xulie = string.Concat(gridViewSubx.GetFocusedRowCellValue("序列"));
        if (!xulie.IsNullOrEmpty() && e.CellValue?.ToString() == xulie)
        {
            e.Appearance.BackColor = Color.Red; //醒目颜色
        }
    }
};

有时候,我们需要反色当前选择的单元格,那么我们可以通过事件CustomDrawCell  进行控制,如下代码所示。

this.gridView1.CustomDrawCell += (s, e) =>
{
    // 设置选中单元格的背景颜色
    if (e.Column == gridView1.FocusedColumn && e.RowHandle == gridView1.FocusedRowHandle)
    {
        e.Appearance.BackColor = Color.LightGreen;
    }
};

 

以上就是一些利用GridView进行处理的一些经验代码总结,希望对您有所启发。