使用DataGridView数据窗口控件,构建用户快速输入体验

在“随风飘散” 博客里面,介绍了一个不错的DataGridView数据窗口控件《DataGridView数据窗口控件开发方法及其源码提供下载》,这种控件在有些场合下,还是非常直观的。因为,在一般要求客户录入数据的地方,一般有两种途径,其一是通过弹出一个新的窗口,在里面列出各种需要输入的要素,然后保存的,如下图所示;

 

其二就是直接在DataGridView中直接输入。这两种方式各有优劣,本文介绍采用该控件实现第二种模式的数据数据。如下图所示

 

 这种方式,直接通过在DataGridView中下拉列表或者文本框中输入内容,每列的数据可以联动或者做限制,实现用户数据的约束及规范化。

控件只要接受了DataTable的DataSource之后,会根据列的HeadText内容,显示表格的标题及内容,应用还是比较直观方便的。

        private void BindGridViewData(DataTable dt, DataTable dtNoRelation)
        {
            organTable = dt;
            noRelationTable = dtNoRelation;

            DataGridView dataGridView1 = new DataGridView();
            this.groupBox1.Controls.Clear();
            this.groupBox1.Controls.Add(dataGridView1);
            dataGridView1.Dock = DockStyle.Fill;
            dataGridView1.CellValueChanged +=new DataGridViewCellEventHandler(organDataGridView_CellValueChanged);
            dataGridView1.UserDeletedRow += new DataGridViewRowEventHandler(organDataGridView_UserDeletedRow);

            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();

            DataGridViewDataWindowColumn col1 = new DataGridViewDataWindowColumn();
            col1.HeaderText = "机构代码";
            col1.Name = "机构代码";   

            //下拉列表的数据
            col1.DataSource = GetDataTable(dtNoRelation);
            dataGridView1.Columns.Add(col1);

            DataGridViewTextBoxColumn col2 = new DataGridViewTextBoxColumn();
            col2.HeaderText = "机构名称";
            col2.Name = "机构名称";
            col2.Width = 300;
            col2.ReadOnly = true;
            dataGridView1.Columns.Add(col2);

            if (dt != null)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    string value = dr[0].ToString();
                    DataGridViewRow row = new DataGridViewRow();
                    DataGridViewDataWindowCell cell = new DataGridViewDataWindowCell();
                    cell.Value = value;
                    row.Cells.Add(cell);
                    cell.DropDownHeight = 400;
                    cell.DropDownWidth = 300;

                    DataGridViewTextBoxCell cell2 = new DataGridViewTextBoxCell();
                    cell2.Value = dr[1].ToString();
                    row.Cells.Add(cell2);
                    dataGridView1.Rows.Add(row);
                }
            }
        }

由于列之间的数据输入等相关的影响需要处理,因此控件的处理方式是通过委托函数进行处理,如上面的部分代码中就是处理这些事件的。

            dataGridView1.CellValueChanged +=new DataGridViewCellEventHandler(organDataGridView_CellValueChanged);
            dataGridView1.UserDeletedRow += new DataGridViewRowEventHandler(organDataGridView_UserDeletedRow);

由于本例子是通过输入内容后,及时更新数据库及控件的显示,因此需要对该事件进行处理,处理代码如下所示。

        private void organDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            DataGridView organDataGridView = sender as DataGridView;
            if (!organDataGridView.IsCurrentCellInEditMode)
                return;

            #region 显示关联机构名称
            if (e.RowIndex > -1)
            {
                if (organDataGridView.CurrentCell.Value == System.DBNull.Value)
                {
                    return;
                }

                if (e.ColumnIndex == 0)
                {
                    DataGridViewCell cell = organDataGridView.Rows[e.RowIndex].Cells["机构代码"];
                    if (cell.Value == null)
                        return;
                    string organCode = cell.Value.ToString();
                    string organName = GetOrganName(organTable, organCode);
                    if (string.IsNullOrEmpty(organName))
                    {
                        organName = GetOrganName(noRelationTable, organCode);
                    }
                    organDataGridView.Rows[e.RowIndex].Cells["机构名称"].Value = organName;
                }
            } 
            #endregion

            if (this.treeView1.SelectedNode != null)
            {
                string gjOrganCode = this.treeView1.SelectedNode.Tag.ToString();
                if (!string.IsNullOrEmpty(gjOrganCode))
                {
                    string yctOrganCode = organDataGridView.CurrentCell.Value.ToString();

                    OrganCodeMapDAL organMapDal = new OrganCodeMapDAL();
                    organMapDal.UpdateOrganMapData(gjOrganCode, yctOrganCode);
                }
            }
        }

        private void organDataGridView_UserDeletedRow(object sender, DataGridViewRowEventArgs e)
        {
            DataGridView organDataGridView = sender as DataGridView;
            string organCode = e.Row.Cells[0].Value.ToString();
            OrganCodeMapDAL organMapDal = new OrganCodeMapDAL();
            organMapDal.DeleteOrganMapData(organCode);
        }

另外,该控件还提供了一个用于对话框窗体中的复杂下拉列表的数据显示方式,控件支持内容的过滤检索,非常方便实用,如下所示

 

该控件的使用代码如下所示:

        private void BindData()
        {            
            //设置DataWindow属性
            this.dataWindow1.PopupGridAutoSize = false;
            this.dataWindow1.DropDownHeight = 300;
            this.dataWindow1.DropDownWidth = 240;
            this.dataWindow1.FormattingEnabled = true;
            this.dataWindow1.sDisplayField = "车辆编码,车牌号码";
            this.dataWindow1.sDisplayMember = "车辆编码";
            this.dataWindow1.sValueMember = "车辆编码";
            this.dataWindow1.SeparatorChar = "|";

            BusDAL busDal = new BusDAL();
            DataTable dt = busDal.GetYCTBusTable(this.txtOrganName.Tag.ToString());
            this.dataWindow1.DataSource = dt;
            this.dataWindow1.AfterSelector += new EventHandler(dataWindow1_AfterSelector);

            //必须在DataSource绑定之后设置该属性
            this.dataWindow1.RowFilterVisible = true;
        }

        //选择完下拉表格后执行的事件
        private void dataWindow1_AfterSelector(object sender, EventArgs e)
        {
        }

 本文转自博客园伍华聪的博客,原文链接:使用DataGridView数据窗口控件,构建用户快速输入体验,如需转载请自行联系原博主。

 

时间: 2024-09-18 22:42:46

使用DataGridView数据窗口控件,构建用户快速输入体验的相关文章

Android自定义DataGridView数据表格控件

我是一个.net程序员,但是苦于公司要求开发一个android app,没办法,只能硬着头皮上了. 由于项目里面很多地方需要用到数据显示控件(类似于.net的DataGridView),度娘找了下发现没人公开类似的控件,没办法只好自己写了. 废话不多说,直接贴代码: public class DataGridView extends HorizontalScrollView { private List<DataGridViewColumn> columns; private List<

组合ASP.NET 2.0数据控件构建强大用户接口

asp.net|接口|控件|数据 在前面的几个专栏中,我们分别介绍了ASP.NET 2.0中的几个数据控件:GridView, DetailsView, 和FormView.本文,我将结合这几个数据控件对GridView控件做一个详细的介绍,使用户能够对每个数据行获得一个详细的了解. 主要控件 DetailsView 和 FormView控件在显示后端数据源中的单个记录时功能强大,但是强迫用户在一页中显示无数条记录这很不现实.为此,我们可以将GridView控件和DetailsView或Form

体验ASP.NET 2.0 中的数据访问控件

asp.net|访问|控件|数据 简介 数据访问一直是开发 Web 应用程序的一个关键问题.几乎每个商业应用程序都需要数据驱动的 Web 页面.由于数据访问如此普遍,开发人员不断地为简单的数据库任务重新生成复杂的代码就显得毫无意义了.开发人员需要从格式各异的不同数据源中快速访问数据.幸运的是,ASP.NET 2.0 中新增的数据访问控件和 ADO.NET 2.0 解决了这一问题. 对于传统的 ASP 和 ASP.NET 1.1 应用程序而言,开发人员不得不创建代码访问和更新数据库,将检索到的数据

asp.net 数据分页控件(不用存储过程)

asp教程.net 数据分页控件(不用存储过程) 本分页控件原理 分页的方法很多,有用存储过程的,有不用存储过程的,还有在c#中用datagridview的虚拟模式的,目的只有一个,对大数据量进行处理,让用户体验得到提高,软件速度得到提升.本分页控件主要是用了下面的sql语句,我相信你能看懂的,存储过程分页也是用类似的sql代码:    1 /*tablename           :表名            如:tbtestdata  2   sqlwherestatement   :sq

基于MVC4+EasyUI的Web开发框架经验总结(2)- 使用EasyUI的树控件构建Web界面

最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开发框架保持一致,而在Web上,我主要采用EasyUI的前端界面处理技术,走MVC的技术路线,在重构完善过程中,很多细节花费不少时间进行研究和提炼,一步步走过来,也积累了不少经验,本系列将主要介绍我在进一步完善我的Web框架基础上积累的经验进行分享,本随笔主要介绍使用EasyUI的树控件构建Web界面的相关经验. 在很多界面设计上,我们可能都需要引入树列表控件,这个控件可以用zTree来实现,也

打造一个通用ASP.NET数据分页控件

asp.net|分页|控件|数据 对于几乎所有的数据表现Web应用来说,组织好数据的显示方式.避免给用户带来混乱的感觉就是最主要的目标之一.每个页面显示20条记录当然是可以接受的,但每页显示10000条记录就很容易给用户带来不便了.将数据分成多个页面显示,即对数据进行分页,是解决此类问题的最常见的办法. 一.慨述 ASP.NET本身只提供了一个支持数据分页的控件,即DataGrid分页控件,不过它比较适合Intranet环境使用,对于Internet环境来说,DataGrid分页控件提供的功能似

打造通用ASP.NET数据分页控件

asp.net|分页|控件|数据 对于几乎所有的数据表现Web应用来说,组织好数据的显示方式.避免给用户带来混乱的感觉就是最主要的目标之一.每个页面显示20条记录当然是可以接受的,但每页显示10000条记录就很容易给用户带来不便了.将数据分成多个页面显示,即对数据进行分页,是解决此类问题的最常见的办法. 一.慨述 ASP.NET本身只提供了一个支持数据分页的控件,即DataGrid分页控件,不过它比较适合Intranet环境使用,对于Internet环境来说,DataGrid分页控件提供的功能似

Windows 控件限制用户的基本法门(C#.NET 篇)

window|控件 /****************************************************************** Windows 控件限制用户的基本法门(.NET 篇) C#.NET 的在下面 ------------------------------------------------------------------- 本代码演示 控制用户的输入的基本方式(屏蔽非数字字符输入) .net 下限制用户输入,看见很多人是在 键盘,或 textBox

ASP.NET 数据列表控件的分页总结(一)自定义方法分页和PageDataSource类分页

在Asp.net中,提供了三个功能强大的列表控件:GridView.DataList和Repeater控件,但其中只有GridView控件提供分页功能.虽然DataGrid提供了分页功能,不过看上去功能有限,但是我们可以通过GridView的一些属性来获取状态以及增加首页.尾页功能按钮.如果在速度效率不是很讲究的情况下,由DataGrid自己管理分页还是不错的,付出的代价就是要把整个相关数据取出来后再删选指定页的数据.好处就是开发速度快,不需要写分页的存储过程.所以若需要追求执行效率,而且数据量