在DevExpress程序中使用GridView直接录入数据的时候,增加列表选择的功能

在我上篇随笔《在DevExpress程序中使用Winform分页控件直接录入数据并保存》中介绍了在GridView以及在其封装的分页控件上做数据的直接录入的处理,介绍情况下数据的保存和校验等操作,不过还没有涉及到数据列表选择的这种方式,而这种在项目应用也是比较广泛的一种输入方式。本篇随笔继续探讨在GridView上直接录入数据,并增加字典选择列表的功能。

1、GridView直接录入数据回顾

在之前整合的数据录入案例里面,我们可以看到可以在列表里面直接录入速度的便捷性,如下所示。

1)直接在GridView上录入并保存

2)基于WInform分页控件的直接录入和保存

这种方式就是利用在Griview上对数据校验后进行保存。

校验通过后提交数据库,我们首先需要做的方式是定位记录集合里面当前的记录,把它转换为具体的实体类对象,然后写入新记录或者更新处理,如下所示。

2、基于数据字典的下拉列表选择输入

我们下面介绍的内容,作为数据直接录入的补充,提供基于数据字典的下拉列表输入方式。

首先我们来看看整体的效果,然后在一步步分析其中的奥秘。

例如对于性别的选择方式。

以及基于可以搜索的下拉列表

以及多选框的数据显示处理

或者基于按钮选择对话框的实现

这些操作能够给列表录入提供多样化的选择,也丰富了用户的输入模式。

那么我们如何基于GridView的基础上实现这些功能呢?

首先我们基于模型构建数据库表,数据库表设计如下所示。

然后基于Database2Sharp代码生成工具生成框架底层的代码,以及生成WInform界面代码,生成的界面代码其中绑定数据部分如下所示。

/// <summary>
/// 绑定列表数据
/// </summary>
private void BindData()
{
    //entity
    this.winGridViewPager1.DisplayColumns = "Name,Sex,Nationality,BirthDate,Height,Weight,City,Area,State,Favorites,Introduction,Creator,CreateTime";
    this.winGridViewPager1.ColumnNameAlias = BLLFactory<Test>.Instance.GetColumnNameAlias();//字段列显示名称转义

    string where = GetConditionSql();
    var list = BLLFactory<Test>.Instance.FindWithPager(where, this.winGridViewPager1.PagerInfo);
    this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<TestInfo>(list);
    this.winGridViewPager1.PrintTitle = "人员测试信息报表";
}   

我们为了添加对应的直接录入方式,我们需要设置其中的字典绑定,处理方式如下所示,我们通过一个函数SetRepositoryItems来封装所需处理。

        /// <summary>
        /// 设置GridControl对应的下拉类别内容,方便转义
        /// </summary>
        private void SetRepositoryItems(GridView gridview)
        {
            var sexList = new List<CListItem>(){new CListItem("男", "1"), new CListItem("女", "2"), new CListItem("未知", "0")};
            gridview.Columns.ColumnByFieldName("Sex").CreateLookUpEdit().BindDictItems(sexList, false);
            gridview.Columns.ColumnByFieldName("City").CreateLookUpEdit().BindDictItems("城市");
            gridview.Columns.ColumnByFieldName("Nationality").CreateSearchLookUpEdit().BindDictItems("民族");
            gridview.Columns.ColumnByFieldName("Area").CreateLookUpEdit().BindDictItems("市场分区");
            gridview.Columns.ColumnByFieldName("State").CreateLookUpEdit().BindDictItems("处理状态");
            gridview.Columns.ColumnByFieldName("Favorites").CreateCheckedComboBoxEdit().BindDictItems("兴趣爱好");
            gridview.Columns.ColumnByFieldName("Introduction").CreateMemoEdit();
            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);
                }
            };

            gridview.OptionsBehavior.ReadOnly = false;
            gridview.OptionsBehavior.Editable = true;
        }

然后在上面的BindData函数里面加入这个方法调用即可。

SetRepositoryItems(this.winGridViewPager1.gridView1);

其中的CreateLookUpEdit、CreateSearchLookUpEdit、CreateCheckedComboBoxEdit、CreateButtonEdit等方法是框架底层进行的内容显示控件的处理,为了方便作为扩展函数直接使用的,其规则类似

代码类似下面的处理方式。

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

 

当然我们还需要注册响应的处理事件,代码如下所示。

private void RegisterEvent()
{
    var grd = this.winGridViewPager1.gridControl1;
    var grv = this.winGridViewPager1.GridView1;

    grv.InitGridView(GridType.NewItem, false);

    #region 列表处理事件
    grv.InitNewRow += delegate(object sender, InitNewRowEventArgs e)
    {
        GridView gridView = grd.FocusedView as GridView;
        gridView.SetFocusedRowCellValue("ID", Guid.NewGuid().ToString());
        gridView.SetFocusedRowCellValue("Creator", LoginUserInfo.Name);
        gridView.SetFocusedRowCellValue("CreateTime", DateTime.Now);
    };

    grv.ValidateRow += delegate(object sender, ValidateRowEventArgs e)
    {
        var result = grd.ValidateRowNull(e, new string[]
        {
            "Name"
        });

        //校验通过后提交数据库
        GridView gridView = grd.FocusedView as GridView;
        if (result)
        {
            var newInfo = grv.GetFocusedRow() as TestInfo;
            if (newInfo != null)
            {
                result = BLLFactory<Test>.Instance.InsertUpdate(newInfo, newInfo.ID);
                if (!result)
                {
                    e.Valid = false;
                    e.ErrorText = string.Format("写入数据出错");
                }
                else
                {
                    base.ShowMessageAutoHide();
                }
            }
        }
    };
    #endregion
}

然后在窗体初始化的时候,调用上面的注册事件即可。

/// <summary>
/// 人员测试信息
/// </summary>
public partial class FrmTest : BaseDock
{
    public FrmTest()
    {
        InitializeComponent();

        InitDictItem();

        this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);
        this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport);
        this.winGridViewPager1.OnEditSelected += new EventHandler(winGridViewPager1_OnEditSelected);
        this.winGridViewPager1.OnAddNew += new EventHandler(winGridViewPager1_OnAddNew);
        this.winGridViewPager1.OnDeleteSelected += new EventHandler(winGridViewPager1_OnDeleteSelected);
        this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh);
        this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;
        this.winGridViewPager1.ShowLineNumber = true;
        this.winGridViewPager1.BestFitColumnWith = false;//是否设置为自动调整宽度,false为不设置
        this.winGridViewPager1.gridView1.DataSourceChanged += new EventHandler(gridView1_DataSourceChanged);
        this.winGridViewPager1.gridView1.CustomColumnDisplayText += new DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventHandler(gridView1_CustomColumnDisplayText);
        this.winGridViewPager1.gridView1.RowCellStyle += new DevExpress.XtraGrid.Views.Grid.RowCellStyleEventHandler(gridView1_RowCellStyle);

        //关联回车键进行查询
        foreach (Control control in this.layoutControl1.Controls)
        {
            control.KeyUp += new System.Windows.Forms.KeyEventHandler(this.SearchControl_KeyUp);
        }

        //注册对应的GridView处理事件
        RegisterEvent();
    }

我们在数据源变化的时候,设置好各个列的宽度,方便正常显示内容就很完美了。

/// <summary>
/// 绑定数据后,分配各列的宽度
/// </summary>
private void gridView1_DataSourceChanged(object sender, EventArgs e)
{
    if (this.winGridViewPager1.gridView1.Columns.Count > 0 && this.winGridViewPager1.gridView1.RowCount > 0)
    {
        //统一设置100宽度
        foreach (DevExpress.XtraGrid.Columns.GridColumn column in this.winGridViewPager1.gridView1.Columns)
        {
            column.Width = 100;
        }
        //Name,Sex,BirthDate,Height,Weight,City,Area,State,Favorites,Introduction,Creator,CreateTime
        //可特殊设置特别的宽度
        SetGridColumWidth("BirthDate", 120);
        SetGridColumWidth("CreateTime", 120);
        SetGridColumWidth("Introduction", 200);
        SetGridColumWidth("Favorites", 200);
    }
}

这样,基于开发框架基础上就完成了这种直接录入数据的处理实现了,非常方便,当然如果直接利用没有封装的GridView处理,基本上也是没有太多变化,思路一样的。

本文转自博客园伍华聪的博客,原文链接:在DevExpress程序中使用GridView直接录入数据的时候,增加列表选择的功能,如需转载请自行联系原博主。

时间: 2024-09-18 04:56:36

在DevExpress程序中使用GridView直接录入数据的时候,增加列表选择的功能的相关文章

在DevExpress程序中使用条形码二维码控件,以及进行报表打印处理

在很多业务系统里面,越来越多涉及到条形码.二维码的应用了,不管在Web界面还是WInform界面都需要处理很多物料相关的操作,甚至很多企业为了减少录入错误操作,为每个设备进行条形码.二维码的标签,直接在流程中进行扫描处理,仅仅在界面勾选一些处理选项即可,极大提高工作效率,降低出错的几率.本篇随笔介绍如何在基于WInform的DevExpress程序中对条形码.二维码的处理,包括界面展示,报表打印等常规的处理. 1.DevExpress的条形码操作及报表打印 在15.1以上的DevEpxress版

在DevExpress程序中使用TeeList控件以及节点查询的处理

在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件,也可以使用DevExpress的TreeList控件进行数据的展示,本篇随笔主要介绍基于DevExpress的TreeList控件使用以及使用SearchControl对节点进行查询的操作. 1. 使用微软的TreeView控件的实现效果和思路 在很多情况下,我们也倾向于使用TreeView控件作为

在DevExpress程序中使用内置的图标构建美观的界面元素

在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略显单调的界面增加一些图标进行点缀,能够达到较好的整体效果.本文介绍在Winform程序界面中,可以使用自己的图标库,也可以引入DevExpress程序中使用内置的图标,从而实现给开发的程序润色. 1.使用自己的图标库 不管在Web还是在WInform项目里面,开发者积累一定的图标库,包括256,12

通讯录-如何在此程序中添加上输出全部数据的函数

问题描述 如何在此程序中添加上输出全部数据的函数 #include "stdio.h" #include "stdlib.h" #include "string.h" /*定义学生结构体*/ struct Student { char ID[20]; char Name[20]; char phone[20]; char address[20]; char QQ[20]; }; /*声明学生数组及学生数量*/ struct Student stu

mfc listbox-MFC-LISTBOX列表框如何在程序中自选多项呢,不用鼠标点击选择

问题描述 MFC-LISTBOX列表框如何在程序中自选多项呢,不用鼠标点击选择 我setcuesel(0)为什么没有反应呢,我想点击某个按钮时自选固定的某几项,应该怎么写呢 解决方案 属性里有个,selectemode,你把它设置成multiextended就可以了

DevExpress程序中使用TreeList控件以及节点查询的教程

在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件,也可以使用DevExpress的TreeList控件进行数据的展示,本篇随笔主要介绍基于DevExpress的TreeList控件使用以及使用SearchControl对节点进行查询的操作. 1. 使用微软的TreeView控件的实现效果和思路 在很多情况下,我们也倾向于使用TreeView控件作为

发送-C#中用Sendkeys向浏览器中的文本框中录入数据

问题描述 C#中用Sendkeys向浏览器中的文本框中录入数据 C#中用Sendkeys向浏览器中的文本框中录入数据,用发送tab切换输入框,为什么切换的时候不能一个一个切换?有的时候会跳过不定几个文本框 发送信息如下 Clipboard.SetText(languagecode); SendKeys.SendWait(""(^v)""); 发送tab如下 SendKeys.SendWait(""{TAB}""); 浏览器中意

在Android应用程序中使用Internet数据

常用缩略词 Ajax: Asynchronous JavaScript + XML API:应用程序编程接口 CSV:逗号分隔值 CSS:层叠样式表 DOM:文档对象模型 HTML:超文本标记语言 HTTP:超文本传输协议 IDL:接口 描述语言 JSON:Javascript 对象标识 SAX:XML 简单 API SDK:软件开发包 UI:用户界面 URL:统一资源定位符 XML:可扩展标记语言 3G:第三代手机技术标准 Android 应用程序必须访问位于 Internet 上的数据,而

我在GridView控件添加了模板列,然后在该模板列的HeaderTemplate中添加了DropDownList控件.希望在程序中访问该DropDownList控件,怎样用?

问题描述 各位高手:我在GridView控件添加了模板列,然后在该模板列的HeaderTemplate中添加了DropDownList控件.希望在程序中访问该DropDownList控件,怎样用?请指教,谢谢! 解决方案 解决方案二:request解决方案三:你在什么事件中取值?可以用FindControl去找解决方案四:DropDownListddl1=(DropDownList)this.GridView1.HeaderRow.FindControl("DropDownList1"