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

devexpress,gridview,动态创建,时候,绑定,不同,编辑,处理,控件 · 浏览次数 : 609

小编点评

**关于GridView的处理方法** **自定义属性** * `CustomColumnDisplayText`:用于自定义列显示文本 * `RowCellStyle`:用于自定义行显示文本 **事件处理** * `CustomDrawCell`:用于自定义列背景色 * `RowCellStyle`:用于自定义行显示文本 * `EditValueChanged`:用于编辑文本 * `CustomDrawCell`:用于自定义列背景色 **方法** * `CreateColumn`:创建列 * `SetColumnReadOnly`:设置列可读 * `SetSummaryColumn`:设置列 Summary * `CreateButtonEdit`:创建按钮编辑器 * `CreateSpinEdit`:创建 SpinEdit 编辑器 * `GetFocusedRowCellValue`:获取焦点行值 * `SetFocusedRowCellValue`:设置焦点行值 * `DeleteRow`:删除记录 * `CustomColumnDisplayText`:设置列显示文本 * `RowCellStyle`:设置行显示文本 **示例** ```csharp // 自定义属性 gridView1.CustomColumnDisplayText += CustomColumnDisplayText; // 事件处理 gridView1.CustomDrawCell += (s, e) => { // 设置背景色 if (e.Column == gridView1.FocusedColumn & e.RowHandle == gridView1.FocusedRowHandle) { e.Appearance.BackColor = Color.LightGreen; } }; // 编辑值事件处理 gridView1.EditValueChanged += (s, e) => { // 设置焦点值 gridView1.FocusedRowHandle = e.RowHandle; }; ``` **一些额外的提示** * 使用 `SetColumnReadOnly` 方法设置列可读 * 使用 `SetSummaryColumn` 方法设置列 Summary * 使用 `CreateButtonEdit` 方法创建按钮编辑器 * 使用 `CreateSpinEdit` 方法创建 SpinEdit 编辑器 * 使用 `GetFocusedRowCellValue` 方法获取焦点行值 * 使用 `SetFocusedRowCellValue` 方法设置焦点行值 * 使用 `DeleteRow` 方法删除记录 * 使用 `CustomColumnDisplayText` 方法设置列显示文本 * 使用 `RowCellStyle` 方法设置行显示文本

正文

在使用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进行处理的一些经验代码总结,希望对您有所启发。

 

与在DevExpress的GridView的列中,动态创建列的时候,绑定不同的编辑处理控件相似的内容:

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

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

在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控件实现产品列表信息的展示和选择

有时候,我们为了方便,我们往往使用扩展函数的代码方式创建很多GridView的操作功能,如在随笔《在DevExpress中使用BandedGridView表格实现多行表头的处理》中介绍过多行表头的创建及绑定处理,在《基于DevExpress的GridControl实现的一些界面处理功能》也介绍了一些特殊的展示效果,本篇随笔介绍在DevExpress的GridView的列中,使用Repository

基于DevExpress的GridControl实现的一些界面处理功能

DevExpress的GridControl控件能够提供很多强大的操作,其视图GridView能够通过各种设置,呈现出多种复杂的界面效果,本篇随笔探讨一些常见的GridControl控件及其GridView的视图操作处理,以便在大家也需要的时候作为一个参考的代码。其中设计一些常见的操作,如合并单元格、汇总统计、复制粘贴行、导入数据处理、导出Excel、导出PDF等、打印GridView视图、内置插

在DevExpress中使用BandedGridView表格实现多行表头的处理

在之前较早随笔中介绍过实现多行表头的处理,通过手工创建字段以及映射数据源字段属性的方式实现,有些客户反映是否可以通过代码方式更方便的创建对应的处理操作,因此本篇随笔继续探讨这个多行表头的处理的操作,使用代码的方式结合扩展函数处理,快速的实现GridControl的多行表头的处理操作。

基于SqlSugar的开发框架循序渐进介绍(19)-- 基于UniApp+Vue的移动前端的功能介绍

在之前的SqlSugar系列随笔中,介绍了很多我们关于SqlSugar的开发框架的内容,SqlSugar的开发框架的目的是多前端应用场景,因此其中会包含各种不同的前端应用,前面介绍了基于DevExpress的Winform的前端应用,以及基于Vue3+TypeScript+ElementPlus的BS前端应用,本篇随笔继续介绍SqlSugar的开发框架的另一个前端应用,基于UniApp+Vue+T

在Winform分页控件中集成保存用户列表显示字段及宽度调整设置

在Winform的分页控件里面,我们提供了很多丰富的功能,如常规分页,中文转义、导出Excel、导出PDF等,基于DevExpress的样式的分页控件,我们在其上面做了不少封装,以便更好的使用,其中就包括集成保存用户列表显示字段及宽度调整设置。本篇随笔介绍这个实现的过程,通过在当前程序中序列化方式存储一个记录用户设置的文件,提供介质的存储和加载处理。

[转帖]k8spacket 和 Grafana 对 kubernetes 的 TCP 数据包流量可视化

https://devpress.csdn.net/k8s/62ff4fe47e66823466193b95.html 你知道你不看的时候你的k8s集群在做什么吗?谁与他建立 TCP 通信?他调用了谁,例如,来自第三方库? 使用k8spacket和Grafana,您可以可视化集群中的 TCP 流量。

深入理解 Vue 3 组件通信

在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件。本文将介绍几种常见的 Vue 3 组件通信方法,包括 props、emits、provide 和 inject、事件总线以及 Vuex 状态管理。 1. 使用 props 和 emits 进行父子组件通信 props

WPF使用AppBar实现窗口停靠,适配缩放、全屏响应和多窗口并列(附封装好即开即用的附加属性)

在吕毅大佬的文章中已经详细介绍了什么是AppBar: WPF 使用 AppBar 将窗口停靠在桌面上,让其他程序不占用此窗口的空间(附我封装的附加属性) - walterlv 即让窗口固定在屏幕某一边,并且保证其他窗口最大化后不会覆盖AppBar占据的区域(类似于Windows任务栏)。 但是在我的

强烈推荐:18.3k star,推荐一款简单易用的HTTP请求流量录制回放工具:Goreplay

在软件开发和测试过程中,我们经常需要对应用程序的网络请求进行录制和回放,以便进行性能分析、压力测试或者模拟复杂的网络环境。今天,我要向大家推荐一款简单易用的 HTTP 请求流量录制回放工具:Goreplay。 1、简介 Goreplay 是一款用 Go 语言编写的 HTTP 请求流量录制回放工具。它