C# winform 中DataGridView中的DataGridViewComboBoxColumn

nonoqiqi 2013-08-30 03:07:39
很疑惑,百度了下,越看越不懂,有的人说用Combobox直接添加进DataGridView中,我不需要这么高端,我只需要自带的控件添加进去,可是我没搞定,希望大侠给点指点
首先
1.拖控件。。。DataGridView、GroupBox等等等,此处省略500字。。。
2.根据数据库的字段来编辑字段,因为我知道里面会包含很多控件,单单的Select语句出来的数据源已经无法阻止我。
[IMG]http://img14.poco.cn/mypoco/myphoto/20130830/14/5562438820130830143810090.jpg[/IMG]
3.界面搭建好了,去后台代码连接数据库取数据源

private void Bind2(int Areacode2)
{
SqlConnection scConnection = new SqlConnection(connstr); //建立Connection
SqlCommand scCommand2 = scConnection.CreateCommand(); //建立Command
scCommand2.CommandText = "select Id,Shipdate,Shipcompany,Company,Portship,Shipday,[20],[40],HQ,Dodate,Endday,Tax,Addcharge,Mark,Areacode1,Areacode2 from zheng where Areacode1=@Areacode1 and Areacode2=@Areacode2";
scCommand2.Parameters.AddWithValue("@Areacode1", area);
scCommand2.Parameters.AddWithValue("@Areacode2", Areacode2);
sdaAdapter2 = new SqlDataAdapter(scCommand2); //建立Adapter
scbBuilder2 = new SqlCommandBuilder(sdaAdapter2); //该对象负责生成用于更新数据库的SQL语句,不必自己创建这些语句
dsSet.Clear(); //使用容器前先清空容器
sdaAdapter2.Fill(dsSet, "zheng"); //填充数据
bind2 = this.BindingContext[dsSet.Tables["zheng"]];
dataGridView2.DataSource = dsSet.Tables["zheng"]; //数据源绑定
}

自己写了个方法取出DataTable数据源并且绑定到DataGridView 到这里全部正确。

然后问题来了,我绑定DataGridViewTextBoxColumn 的字段都字段名和 DataSouce名字一致,
但是DataGridViewComboBoxColumn 我在图形视图没有设置,导致DataGridView里多出字段来。。。
我需要的是数据库 SELECT出来的字段正好是我DataGridView里的字段,而DataGridViewTextBoxColumn这列显示的也正好是我数据库里的查出来的值,当我鼠标点击下拉框的时候,DataGridViewTextBoxColumn 该列再出现一个数据源,是下拉数据源,比如说
{{value:男,index:0},{value:女,index:1},{value:未知,index:3}}
怎么做,也就是有两数据源的概念
[IMG]http://img14.poco.cn/mypoco/myphoto/20130830/14/5562438820130830144009078.jpg[/IMG]这个是数据库查出来的,那么这个 Shipdate这列就应该是第一行是男,第二行是女,当我点击这列时候再出现 “男 女 未知”这个数据源给我选
...全文
641 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
williamxia8 2015-09-07
  • 打赏
  • 举报
回复
引用 13 楼 czz65979674 的回复:
先不管你绑定的东西是哪里来的

                DataTable temptable = new DataTable();
                temptable.Columns.Add("index");
                temptable.Columns.Add("value");
                ((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).Resizable = DataGridViewTriState.False;
                for (int no = 0; no < 3; no++)
                {
                    temptable.Rows.Add((no).ToString(), string.Format("{0} {1}", (no).ToString(), moji_saki_kubun(no)));

                }
                ((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).DataSource = temptable;
                ((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).DisplayMember = "value";
                ((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).ValueMember = "index";
moji_saki_kubun 里 写的就是你 获取到的 所有下拉框绑定的东西 取初始值的时候 grid_homon_saki.Rows[i].Cells[1].Value = s.value.ToString(); 直接写就好 dt[i].tosting是你从数据库 明确值的那个 然后 更新就和TEXT形式的GRID什么的也就都一样了。
非常感谢
czz65979674 2013-09-02
  • 打赏
  • 举报
回复
下次记得 有问题的时候 引用一下 要不然 回答的人也看不到是不是有新的问题·····
nonoqiqi 2013-09-02
  • 打赏
  • 举报
回复
问题解决了 ((DataGridViewComboBoxColumn)dataGridView2.Columns[1]).DisplayMember = "Name"; ((DataGridViewComboBoxColumn)dataGridView2.Columns[1]).ValueMember = "Name"; 因为我数据库里放的也值,所以这里也要写值,不能写value
nonoqiqi 2013-09-02
  • 打赏
  • 举报
回复
COMBOBOX是绑定上去了,下拉菜单数据也有了 就是查出来原始记录这一列还是不显示 我现在只要图形化界面一设置DataPropertyName 或者加代码 this.dataGridView2.Columns[1].DataPropertyName = "Shipdate"; 都会报错,不加,它就在我后面再添加SELECT出来的字段名
  • 打赏
  • 举报
回复
DataGridView中的DataGridViewComboBoxColumn这比较麻烦些,需先对数据进行处理再绑定。
nonoqiqi 2013-08-30
  • 打赏
  • 举报
回复
懂了,大哥,我试试,谢谢
czz65979674 2013-08-30
  • 打赏
  • 举报
回复
我给你理下思路 你把要绑定的东西 查出来 放到个list_a里面 for (int no = 0; no < list_a.count; no++) { temptable.Rows.Add(list_a[no]) } 这样就把整列的COMB 都绑定上了这一组数据了 至于查出来其他初始值 和 更新进去的时候 就已经和原来这一列 是不是COMB 关联不大了 和是TEXT形式的做法是一样 一样的了
czz65979674 2013-08-30
  • 打赏
  • 举报
回复
setteidialog 你不管 其实是个画面 是我的子画面 grid_homon_saki 就是我这个画面的 DATAGRIDVIEW
nonoqiqi 2013-08-30
  • 打赏
  • 举报
回复
setteidialog是什么东东 grid_homon_saki又是什么对象?
nonoqiqi 2013-08-30
  • 打赏
  • 举报
回复
那图形化界面那个值还要对应数据库查出来的字段名写上去吗? [IMG]http://img14.poco.cn/mypoco/myphoto/20130830/15/5562438820130830154424051.jpg[/IMG]
czz65979674 2013-08-30
  • 打赏
  • 举报
回复
先不管你绑定的东西是哪里来的

                DataTable temptable = new DataTable();
                temptable.Columns.Add("index");
                temptable.Columns.Add("value");
                ((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).Resizable = DataGridViewTriState.False;
                for (int no = 0; no < 3; no++)
                {
                    temptable.Rows.Add((no).ToString(), string.Format("{0} {1}", (no).ToString(), moji_saki_kubun(no)));

                }
                ((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).DataSource = temptable;
                ((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).DisplayMember = "value";
                ((DataGridViewComboBoxColumn)setteidialog.grid_homon_saki.Columns[1]).ValueMember = "index";
moji_saki_kubun 里 写的就是你 获取到的 所有下拉框绑定的东西 取初始值的时候 grid_homon_saki.Rows[i].Cells[1].Value = s.value.ToString(); 直接写就好 dt[i].tosting是你从数据库 明确值的那个 然后 更新就和TEXT形式的GRID什么的也就都一样了。
feiniao19830822 2013-08-30
  • 打赏
  • 举报
回复
贴一张图
nonoqiqi 2013-08-30
  • 打赏
  • 举报
回复
一样的方式 SELECT 语句查出来的结果集 就是这两列 [IMG]http://img14.poco.cn/mypoco/myphoto/20130830/16/5562438820130830162015090.jpg[/IMG]
feiniao19830822 2013-08-30
  • 打赏
  • 举报
回复
引用 7 楼 nonoqiqi 的回复:
4楼大哥

        private void BindShipdate()
        {
            DataGridViewComboBoxColumn shipdate = (DataGridViewComboBoxColumn)dataGridView2.Columns["Shipdate"];

            DataTable dtSex = new DataTable();
            dtSex.Columns.Add("Value");
            dtSex.Columns.Add("Name");
            DataRow drSex;
            drSex = dtSex.NewRow();
            drSex[0] = "0";
            drSex[1] = "男";
            dtSex.Rows.Add(drSex);
            drSex = dtSex.NewRow();
            drSex[0] = "1";
            drSex[1] = "女";
            dtSex.Rows.Add(drSex);
            drSex = dtSex.NewRow();
            drSex[0] = "2";
            drSex[1] = "未知";
            dtSex.Rows.Add(drSex);
            shipdate.ValueMember = "Value";
            shipdate.DisplayMember = "Name";
            shipdate.DataSource = dtSex;
       
        }
应该是没问题的,估计你在绑定时有点问题。 1.你在绑定datagridview时,DataGridViewComboBoxColumn 这一列绑定的值是不是数(0,1,2)? 2.你在设定绑定下拉列表列的时候是如何设定的? 下面给你一个我这边绑定的代码(界面设定和你类似,多了设定DataPropertyName)。

            //这边是数据绑定的代码,其中第二列是DataGridViewComboBoxColumn 
            DataTable dt= new DataTable("ForTest");
            dt.Columns.Add("Column1", Type.GetType("System.Int32"));
            dt.Columns.Add("Column3", Type.GetType("System.String"));
            DataRow y;
            y = dt.NewRow();
            y["Column1"] = 1;
            y["Column3"] = 1;
            dt.Rows.Add(y);


            DataTable dtSex = new DataTable();
            dtSex.Columns.Add("Value");
            dtSex.Columns.Add("Name");
            DataRow drSex;
            drSex = dtSex.NewRow();
            drSex[0] = "0";
            drSex[1] = "男";
            dtSex.Rows.Add(drSex);
            drSex = dtSex.NewRow();
            drSex[0] = "1";
            drSex[1] = "女";
            dtSex.Rows.Add(drSex);
            drSex = dtSex.NewRow();
            drSex[0] = "2";
            drSex[1] = "未知";
            dtSex.Rows.Add(drSex);

            DataGridViewComboBoxColumn  columnCbx = ((DataGridViewComboBoxColumn)dataGridView1.Columns[1]);
            columnCbx.ValueMember = "Value";
            columnCbx.DisplayMember = "Name";
            columnCbx.DataSource = dtSex;
            dataGridView1.DataSource = dt;
czz65979674 2013-08-30
  • 打赏
  • 举报
回复
引用 5 楼 nonoqiqi 的回复:
3楼就是你这个意思,我现在是测试 所以绑定 一个 {{value:男,index:0},{value:女,index:1},{value:未知,index:3}} 数组玩玩,其实真实绑定下拉可能几百个
那你绑定的可能的值 是几百个 是固定的吧? 从哪里来呢?
men52676521 2013-08-30
  • 打赏
  • 举报
回复
''' <summary> ''' grid中的下拉框必须要处理一下,不然会报(对象必须实现iconvertible)错误 ''' </summary> ''' <param name="sender"></param> ''' <param name="e"></param> ''' <remarks></remarks> Private Sub RepositoryItemComboBox1_ParseEditValue(ByVal sender As System.Object, ByVal e As DevExpress.XtraEditors.Controls.ConvertEditValueEventArgs) Try e.Value = e.Value.ToString() e.Handled = True Catch ex As Exception MsgBox(ex.Message.ToString, MsgBoxStyle.Critical) End Try End Sub 你看看吧!vb的代码,不过应该一样。
nonoqiqi 2013-08-30
  • 打赏
  • 举报
回复
4楼大哥

        private void BindShipdate()
        {
            DataGridViewComboBoxColumn shipdate = (DataGridViewComboBoxColumn)dataGridView2.Columns["Shipdate"];

            DataTable dtSex = new DataTable();
            dtSex.Columns.Add("Value");
            dtSex.Columns.Add("Name");
            DataRow drSex;
            drSex = dtSex.NewRow();
            drSex[0] = "0";
            drSex[1] = "男";
            dtSex.Rows.Add(drSex);
            drSex = dtSex.NewRow();
            drSex[0] = "1";
            drSex[1] = "女";
            dtSex.Rows.Add(drSex);
            drSex = dtSex.NewRow();
            drSex[0] = "2";
            drSex[1] = "未知";
            dtSex.Rows.Add(drSex);
            shipdate.ValueMember = "Value";
            shipdate.DisplayMember = "Name";
            shipdate.DataSource = dtSex;
       
        }
nonoqiqi 2013-08-30
  • 打赏
  • 举报
回复
4楼大哥,按照你的方法我去绑了 [IMG]http://img14.poco.cn/mypoco/myphoto/20130830/15/5562438820130830154424051.jpg[/IMG] 悲剧报错: [IMG]http://img14.poco.cn/mypoco/myphoto/20130830/15/5562438820130830154305050.jpg[/IMG]
nonoqiqi 2013-08-30
  • 打赏
  • 举报
回复
3楼就是你这个意思,我现在是测试 所以绑定 一个 {{value:男,index:0},{value:女,index:1},{value:未知,index:3}} 数组玩玩,其实真实绑定下拉可能几百个
feiniao19830822 2013-08-30
  • 打赏
  • 举报
回复
手动绑定。 1.数据源还是原来的。dataGridView2.DataSource = dsSet.Tables["zheng"]; //数据源绑定 2.dataGridView2每一列的DataPropertyName都要写上sql中对应的字段。 3.DataGridViewComboBoxColumn的DataSource处绑定{{value:男,index:0},{value:女,index:1},{value:未知,index:3}},并设定DisplayMember和ValueMember
加载更多回复(3)

110,537

社区成员

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

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

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