DataGridView嵌入comboBox以及DataGridViewComboBoxColumn数据绑定

我们在客户端程序的设计中经常会用到组合下拉框,就像这种情况 
 
我在项目中想用datagridview来实现这种功能,看了若干博客,msdn也翻了半天,终于有了一点理解。 
这里有几个关键点: 
1、datagridview控件的列的类型有多重,包括 
(1)DataGridViewTextBoxColumn(文本列,默认的情况下就是这种) 
(2)DataGridViewComboBoxColumn(组合框列,名字瞎起的,就是这个功能要用到的列) 
(3)DataGridViewLinkColumn(链接列) 
(4)DataGridViewButtonColumn(按钮列) 
(5)DataGridViewCheckBoxColumn(打钩列?差不多这个意思) 
我想要添加一个这样的组合框列,就选择新建DataGridViewComboBoxColumn,然后添加到datagridview中去就可以了,这是基本想法。 
2、DataGridViewComboBoxColumn的数据绑定 
DataGridViewComboBoxColumn有几个关键属性 
(1)DataSource:顾名思义,绑定的数据,把需要绑定的表赋值就可以 
(2)DataPropertyName:根据msdn说法是设置数据源属性的名称,我理解就是这是从大表里选择数据,用数据源属性名称来标识一下这个是什么属性。可以随意写,也可以不写,应该是起一个提示的作用。 
(3)DisplayMember:这是最关键的属性,首先,它必须是数据表的一个字段,其次,它是前台显示出的数据。所以,它就是相当于一个select语句,从DataSource的Table中检索字段名=DisplayMember的所有数据。Select ‘DisplayMember’ from ‘DataSource’(‘’中的表示用相应的实际数据替换),其实理论上DisplayMember+DataSource就可以完成了这个combox嵌入datagridview的功能了。 
(4)ValueMember:

Gets or sets a string that specifies the property or column from which to get values that correspond to the selections in the drop-down list. 
获取或设置一个字符串,此字符串指定要从其中获取与下拉列表的选项对应的值的属性或列。

这个属性应该是为了和DisplayMember组成一个映射关系,但是根据msdn的说法

In this example, the DisplayMember is set to the same value as ValueMember because no mapping is necessary. 
DisplayMember 设置为负责包含用户可查看的文本的属性名称。 在此示例中, DisplayMember 设置相同的值为 ValueMember 因为没有映射是必需的。

虽然这个翻译很费解,但是勉强能懂,就是在不需要映射时,将ValueMember 的值设置的和DisplayMember 一样就好了。

那就写几行代码示意一下:

 private void Form2_Load(object sender, EventArgs e)
        {
            //辅助处理类,不用管
            EvaluateHierarchyManage.EvaluateHierarchyManage standard = new EvaluateHierarchyManage.EvaluateHierarchyManage();
            //Standard绑定了一张数据库里的表"EvaluateHierarchy"
            DataSet Standard= standard.GetAllInfo();
            //辅助处理类,不用管
            EvaluateDataManage.EvaluateDataManage data = new EvaluateDataManage.EvaluateDataManage();
            //data绑定了一张数据库里的表"EvaluateData"
            DataSet Data = data.GetAllInfo();

            int i = 0;
            for (i = 0; i < data.Tables[0].Columns.Count; i++)
            {
                //添加用户选择栏
                DataGridViewComboBoxColumn combox = new DataGridViewComboBoxColumn();
                combox.DataPropertyName = "PrimeStandard1";
                //必须和数据库字段名保持一致,此字段中的数据为前台显示在datagridview的数据
                combox.DisplayMember = "Classification";
                //和DisplayMember 保持一致
                combox.ValueMember = "PrimeStandard";
                //绑定数据
                combox.DataSource = data.Tables[0];
                //添加到datagridview控件
                dataGridView1.Columns.Add(combox);
            }
        } 

然后再谈一个小问题:我的软件设计上要出现这种情况:用户的输入可能是不规范的,我提供给他combox进行选择,同时他也需要输入数据,用户输入的数据是作为原始数据留存,用户选择的数据是作为计算的依据(因为预制的选项对于软件开发的人来讲一定是规范的) 
大概就像这样 
 
也写了两行代码来实现,当然也很简单,就是不同的列的组合,也po上来做个记录

  private void Form2_Load(object sender, EventArgs e)
        {
            EvaluateHierarchyManage.EvaluateHierarchyManage standard = new EvaluateHierarchyManage.EvaluateHierarchyManage();
            DataSet Standard= standard.GetAllInfo();
            EvaluateDataManage.EvaluateDataManage data = new EvaluateDataManage.EvaluateDataManage();
            DataSet Data = data.GetAllInfo();
            DataBase.DataBase database = new DataBase.DataBase();

            List<string> columnsname=new List<string>();
            foreach(DataColumn  c in Data.Tables[0].Columns)
            {
                columnsname.Add(c.ColumnName);
            }

            foreach (string s in columnsname)
            {
                string sql = "select Classification,ID from EvaluateHierarchy where TwoLevelStandard=‘" + s+"‘";
                SqlCommand command = new SqlCommand(sql,database.con);
                SqlDataAdapter sda = new SqlDataAdapter(command);
                DataSet ds = new DataSet();
                sda.Fill(ds);
                //添加用户填写栏
                if (ds.Tables[0].Rows.Count != 0)
                {
                    DataGridViewTextBoxColumn dgvc = new DataGridViewTextBoxColumn();
                    dgvc.HeaderText = s + "用户填写";
                    dataGridView1.Columns.Add(dgvc);
                }

                //添加用户选择栏
                DataGridViewComboBoxColumn combox = new DataGridViewComboBoxColumn();
                combox.DataPropertyName = "Classification";
                //必须和数据库字段名保持一致,此字段中的数据为前台显示在datagridview的数据
                combox.DisplayMember = "Classification";
                //必须和DisplayMember字段保持一致
                combox.ValueMember = "Classification";
                combox.DataSource = ds.Tables[0];
                combox.HeaderText = s;
                try
                {
                    dataGridView1.Columns.Add(combox);
                }
                catch(Exception ex)
                {

                }

            }
        }

原文地址:https://www.cnblogs.com/qi123/p/8972147.html

时间: 2024-10-28 02:27:05

DataGridView嵌入comboBox以及DataGridViewComboBoxColumn数据绑定的相关文章

在EasyUI的DataGrid中嵌入Combobox

在做项目时,需要在EasyUI的DataGrid中嵌入Combobox,花了好几天功夫,在大家的帮助下,终于看到了它的庐山真面: 核心代码如下: <html> <head> @*添加Jquery EasyUI的样式*@ <link href="@Url.Content("../../Content/JqueryEasyUI/themes/default/easyui.css")" rel="stylesheet" /

winform中DataGridView添加ComboBox的最终解决方案(点击ComboBox默认显示当前行的内容)

第一: 数据绑定ComBoBox控件 先在窗体设计时拖一个ComBoBox控件,然后在里面的ITEMS设好你要下拉项,或者从数据库中的表绑定,这个估计都会. 第二: // 将下拉列表框加入到DataGridView控件中,这句放在绑定DataGridView之后写. 在窗体的Load方法中加入:g_DataGridView.Controls.Add(g_ComBoBox);也就是把ComBoBox控件添加到DataGridView控件中第三: 在DataGridView控件的CurrentCel

C# DataGridViewComboBoxColumn 数据绑定

dataGridView1.Columns.Clear(); dataGridView1.AutoGenerateColumns = false; dataGridView1.DataSource = dt; DataGridViewComboBoxColumn comUserName= new DataGridViewComboBoxColumn(); comUserName.DataPropertyName = "userName";//**设置数据源属性的名称 comUserNa

winform datagridview中combobox列改变选项时触发其他列变化

之前想使用DataGridView的SelectionChanged事件,但是使用了后并没有达到效果 最后使用下面的方式实现: private void materialCheckGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { int cidx = materialCheckGridView.CurrentCell.ColumnIndex; if (mate

DataGridView中的Combobox的应用

在WinForm中DataGridView可谓是应用比较多的数据显示控件了,DataGridView中可以应用各种控件,关于这样的文章网上 已有很多.都是实例化一个控件然后通过DataGridView.Controls.Add()方法绑定控件.然后通过特定的事伯执行数据绑定与操作. 这几天在做项目的时候也也用到的DataGridView控件,而且需要要DataGridView使用ComboBox来动态的显示数据.查了不少 的资料来完成DataGridView中的ComboBox的数据绑定,多数都

在DataGridView控件中加入ComboBox下拉列表框的实现

在DataGridView控件中加入ComboBox下拉列表框的实现 转自:http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.html 虽然在Visual Studio中 DataGridView控件的DataGridViewComboBoxColumn可以实现下拉列表框,但这样的列会在整列中都显示下拉列表框,不太美观,而且还要用代码实现数据绑定.本文介绍一种只在当前编辑单元格中显示下拉列表框的方法,供大家参考. 首先新建一个W

C#使用Linq对DataGridView进行模糊查找

针对DataGridView中已进行过数据绑定,即已向DataGridView中添加了一些数据,可以结合Linq查询,并让匹配查询的行高亮显示,如下图: ? ? 具体实现如下: ? [csharp] view plain copy using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; ? namespace Maxes_PC_Client { public pa

关于WinCE开发的一些心得

创建这个博客已经有一年多了. 一直断断续续的,原创也没写几篇,对技术的学习也没有以前那么努力了.现在又重新开始写博客了,不知能坚持到什么时候..... 最近项目需要做手持设备的开发,WinCE的系统,.net3.5的平台,好多东西都缺,实在是让人无语,不过还好,网上的大神多,我就随便写写吧(其实是想水一篇......). 就目前项目而言,主要的问题就集中在数据集显示(表格显示)和网络这一块. 因为WinCE只有DataGrid,而且是很不完全的那种,样式设置和选择设置非常麻烦,要想加入高级功能,

【Visual Studio】Visual C# 中XML注释的使用(含注释在开发时显示换行)

为函数方法注释说明要用到 xml 语句 <summary> 段落说明 </summary> .<para> 新段示例说明 </para>.<para> </para> 空行要加入全角空格 下面的注释会破坏原有标注结构: [csharp] view plain copy /// <summary> 第一行 说明 /// <para>第二行说明</para> /// <para> ←最前面的