DataGridView中的ComboBox显示

windxx 2010-06-11 03:07:43
可以用以下方式实现DataGridView中checkBox的自动显示:
DataTable dTable = new DataTable();
dTable.Columns.Add("IsChecked", System.Type.GetType("System.Boolean"));

...

DataGridView1.DataSourc = dtTable; // 这里可以应用DataSource自动榜定,将会对"true"和"false"字符串自动判断并显示为checkBox形式

现在有table1:
ID NAME
1 A
2 B
table2:
ID NAME TYPE
001 CUST1 1
002 CUST2 2

需要在DataGridView1中显示为
ID NAME TYPE
001 CUST1 A
002 CUST2 B


1.DataGridView1中TYPE列为 DataGridViewComboBoxColumn形式,即ValueMember=table1.ID;DisplayMember = table1.NAME;
2.可以使用DataSource形式绑定(因为这样迅速,如果foreach每行添加数据多的时候很慢)


目前用手动生成dataGridView1各个列(设置TYPE为DataGridViewComboBoxColumn),之后foreach要绑定的table2各个行,逐行添加,数据多的时候非常缓慢,明显比dataGridView1.DataSource = table2;慢很多
而且如果手动设置TYPE为DataGridViewComboBoxColumn之后我不知道怎么应用DataSource绑定,它会自动在列后边添加table2的各个列出来,如果设置AutoGenerateColumns属性为false,那么将不添加列了,目前不知道怎么实现,不知道是不是可以像上面现实checkBox那样,直接在DataTable上处理,我看MSDN,DataColumn.DataType好像没有DataTable之类的选项,都是Int或者Boolean之类,请教大家到底应该如何解决!非常多谢!如果没有表述清楚,请发送到我邮箱windxxxx@163.com,我没有多少分,能给多少给多少,每次问都没有下文,请大家帮忙啊!这个功能非常简单和常用,料应不会没有解决方法,请大家指教!


请不要说在数据库方用select 联合表解决。。。因为我需要在dataGridView上的TYPE列进行类似ComboBox的选择。
...全文
354 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
windxx 2010-06-12
  • 打赏
  • 举报
回复
可能我没有看懂上边的代码,我运行的时候会有问题,可能大家没有看懂我的意思,我的意思是实现上边的功能并且可以快速的填充数据,我原来的实现方法是这样的(对应单一下拉列表如下边例子):
对应单一显示(就是应用DataGridViewComboBoxColumn)
1)逐个添加DataGridView的各个列(根据构造的不同,在添加类的时候可以添加DataGridViewColumn/DataGridViewComboBoxColumn/DataGridViewCheckBoxColumn等)
2)得到TableSource(对应DataGridView的数据源)
3)得到TableList(对应DataGridViewComboBoxColumn的数据源)(这里假设只有一个DataGridViewComboBoxColumn,方便说明)
4)根据TableSource逐行添加DataGridView(for或foreach)
这样,可以实现想要的comboBox列。
但是我的问题是:这样加载(for/foreach)我个人感觉速度明显慢于直接设置DataGridView.DataSource的速度,可以看到逐行的绘制。
我想到,checkBox可以用以下方是显示,并且可以直接应用DataGridView的DataSource属性邦定数据源:
DataTable dTable = new DataTable();
dTable.Columns.Add("IsChecked", System.Type.GetType("System.Boolean"));

...

DataGridView1.DataSourc = dtTable; // 这里可以应用DataSource自动榜定,将会对"true"和"false"字符串自动判断并显示为checkBox形式(这个是在table的数据格式上作了手脚,容易,快速)
速度明显快很多,因此我想问问,可否有什么方法实现在DataGridView中添加DataGridViewComboBoxColumn列,并且可以应用DataGridView的DataSource属性自动添加数据(快)。

感觉如梦兄讲的好像是我要的(不是后边那个sex那个,那个还是逐行add,速度很慢的),但是在代码实现的时候总是提示错误。
//DataGridViewComboBoxColumn cmbox = dataGridView1.Columns["TYPE"] as DataGridViewComboBoxColumn;
DataGridViewComboBoxColumn cmbox = new DataGridViewComboBoxColumn();
cmbox.DataSource = dtList;
cmbox.DataPropertyName = "TYPE";
cmbox.DisplayMember = "NAME";
cmbox.ValueMember = "ID";
dataGridView1.Columns.Add(cmbox);

dataGridView1.DataSource = dtSource;

dataGridView1.DataSource = dtSource;放在前边也不行,只要执行DataGridViewComboBoxColumn cmbox = dataGridView1.Columns["TYPE"] as DataGridViewComboBoxColumn;
就会提示: cmbox.DataSource = dtList;未将对象引用设置到对象的实例
DataGridViewComboBoxColumn cmbox = new DataGridViewComboBoxColumn();当然可以正常执行,但是没有意义,会在dataGridView的列后边添加一个新的列,但是和数据都没有关系只是对应了tableList而已。
所以,我的问题很简单,就是,如果让DataGridView带有DataGridViewComboBoxColumn的列,并且可以设置其对应的table,那么是否可以以用DataGridView.DataSource属性指定数据源(不是追加列那种,是正常的显示,相应的DataGridViewComboBoxColumn用指定的DisplayMember代替DataSource数据源中相应列的Value),如何实现(实现步骤),谢谢!感谢大家的关心和指导,希望大家能够继续指教!
cry615 2010-06-11
  • 打赏
  • 举报
回复
select a.id,b.name ,b.Name as type from table2 a left join table1 b on a.TYPE=b.id


DatagridViewComboxColumn cmbox = Datagridview.Columns["COmbox控件的Name"] as DatagridViewComboxColumn ;

cmbox.DataSource = 下框的数据源;
cmbox.DataPropertyName= datagrid的数据源的要绑定的列;
cmbox.d...Member="下拉框显示的TEXT";
cmbox.ValueMember="隐藏的值";


DataGridViewComboBoxColumn csex = new DataGridViewComboBoxColumn();
csex.DataPropertyName = "sSex";
csex.HeaderText = "性别";
DataTable dt = new DataTable();
dt.Columns.Add("sexname");
dt.Columns.Add("sexvalue");
DataRow dr = dt.NewRow();
dr[0] = "男";
dr[1] = "1";
dt.Rows.Add(dr);
DataRow dr1 = dt.NewRow();
dr1[0] = "女";
dr1[1] = "2";
dt.Rows.Add(dr1);

csex.DataSource = dt;
csex.ValueMember = "sexvalue";
csex.DisplayMember = "sexname";
this.datagridview1.Columns.Add(csex);
如梦的解释已经好清楚了。
comboBox1.DataSource = "绑定数据";
comboBox1.DisplayMember = "name";//comboBox1中要添加的数据,对应数据库的字段或实体类的字段
comboBox1.ValueMember = "id"; //数据对应的数据库的id号或实体类的字段
int i = comboBox1.SelectedValue; //这是你要删除,修改是数据的id
DataGridView中的ComboBox的DisplayMember ,ValueMember 在编程 中用处很大,调用和处理一些逻辑方面的东西,很方便。
xk1126 2010-06-11
  • 打赏
  • 举报
回复

comboBox1.DataSource = "绑定数据";
comboBox1.DisplayMember = "name";//comboBox1中要添加的数据,对应数据库的字段
comboBox1.ValueMember = "id"; //数据对应的数据库的id号
int i = comboBox1.SelectedValue; //这是你要删除,修改是数据的id
捷哥1999 2010-06-11
  • 打赏
  • 举报
回复
如梦的方法可行,首先用表联合,得到这样的数据:
需要在DataGridView1中显示为
ID NAME TYPE
001 CUST1 A
002 CUST2 B

然后,你就可以做数据绑定了。

DataGridViewComboBoxColumn.DataSource 获取或设置填充组合框的选项的数据源。
DataGridViewComboBoxColumn.DataPropertyName 获取或设置数据源属性的名称或与 DataGridViewColumn 绑定的数据库列的名称。
DataGridViewComboBoxColumn.DisplayMember 获取或设置一个字符串,此字符串指定要从其中检索在组合框中显示的字符串的属性或列。
DataGridViewComboBoxColumn.ValueMember 获取或设置一个字符串,此字符串指定要从其中获取与下拉列表的选项对应的值的属性或列。
wuyq11 2010-06-11
  • 打赏
  • 举报
回复
select a.id,b.name ,b.Name as type from table2 a left join table1 b on a.TYPE=b.id


DatagridViewComboxColumn cmbox = Datagridview.Columns["COmbox控件的Name"] as DatagridViewComboxColumn ;

cmbox.DataSource = 下框的数据源;
cmbox.DataPropertyName= datagrid的数据源的要绑定的列;
cmbox.d...Member="下拉框显示的TEXT";
cmbox.ValueMember="隐藏的值";


DataGridViewComboBoxColumn csex = new DataGridViewComboBoxColumn();
csex.DataPropertyName = "sSex";
csex.HeaderText = "性别";
DataTable dt = new DataTable();
dt.Columns.Add("sexname");
dt.Columns.Add("sexvalue");
DataRow dr = dt.NewRow();
dr[0] = "男";
dr[1] = "1";
dt.Rows.Add(dr);
DataRow dr1 = dt.NewRow();
dr1[0] = "女";
dr1[1] = "2";
dt.Rows.Add(dr1);

csex.DataSource = dt;
csex.ValueMember = "sexvalue";
csex.DisplayMember = "sexname";
this.datagridview1.Columns.Add(csex);
lxt106297 2010-06-11
  • 打赏
  • 举报
回复
this.comboBox3.DropDownStyle = ComboBoxStyle.DropDownList;
SqlConnection conn1 = new SqlConnection("server=Server01;database=ERPDB;user id=sa;password=sa");
conn1.Open();

SqlCommand cmd1 = new SqlCommand("select * from bs_ResourceSort", conn1);
SqlDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
this.comboBox3.Items.Add(dr1[1].ToString());
}
dr1.Close();
看看这个代码,你就清楚了啊
  • 打赏
  • 举报
回复
有点模糊、 帮顶了
g394594141 2010-06-11
  • 打赏
  • 举报
回复
windxx 2010-06-11
  • 打赏
  • 举报
回复
最好有代码,本人愚钝,简单说明总是理解不了。如简单说不清楚,可以留下邮箱,我在邮件询问并听取解释!多谢

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧