很疑惑,百度了下,越看越不懂,有的人说用Combobox直接添加进DataGridView中,我不需要这么高端,我只需要自带的控件添加进去,可是我没搞定,希望大侠给点指点
首先
1.拖控件DataGridView、GroupBox等等等,此处省略500字
2.根据数据库的字段来编辑字段,因为我知道里面会包含很多控件,单单的Select语句出来的数据源已经无法阻止我。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}}
怎么做,也就是有两数据源的概念 
这个是数据库查出来的,那么这个 Shipdate这列就应该是第一行是男,第二行是女,当我点击这列时候再出现 “男 女 未知”这个数据源给我选

解决方案 »

  1.   

    后面的英文名字的是我SELECT语句查出来多余的字段,也就是我编辑列的时候没有在图形化界面绑定
      

  2.   

    其实这个 Shipdate 就是我图形化界面的那个“船期”下拉字段
    它没有绑定,我没设字段,设了会报错,代码怎么绑它,它有两个数据源的概念啊,一个是SELECT出来数据库表里真正的值,一个是点击给予下拉的数据源
      

  3.   

    我先理理 你要说的意思 ,  也就是说 比如 船期是你数据库的字段 , 而船期 有 3个值 1:男 2:女
    3: 未知  。    数据库 如果读出来是 女 那么 这下面的COMB 就选中为女 ,然后你可以改变其中的值 变成选男,然后OK 就可以把 男 更新到对应数据里。
    大体是这样吧。  
      

  4.   

    手动绑定。
    1.数据源还是原来的。dataGridView2.DataSource = dsSet.Tables["zheng"]; //数据源绑定  
    2.dataGridView2每一列的DataPropertyName都要写上sql中对应的字段。
    3.DataGridViewComboBoxColumn的DataSource处绑定{{value:男,index:0},{value:女,index:1},{value:未知,index:3}},并设定DisplayMember和ValueMember
      

  5.   

    3楼就是你这个意思,我现在是测试 所以绑定 一个 {{value:男,index:0},{value:女,index:1},{value:未知,index:3}} 数组玩玩,其实真实绑定下拉可能几百个
      

  6.   

    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;
           
            }
      

  7.   

      ''' <summary>
        ''' grid中的下拉框必须要处理一下,不然会报(对象必须实现iconvertible)错误
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <res></res>
        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的代码,不过应该一样。
      

  8.   

    应该是没问题的,估计你在绑定时有点问题。
    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;
      

  9.   

    一样的方式
    SELECT 语句查出来的结果集
    就是这两列
      

  10.   

    先不管你绑定的东西是哪里来的                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什么的也就都一样了。
      

  11.   

    setteidialog是什么东东grid_homon_saki又是什么对象?
      

  12.   

    setteidialog 你不管 其实是个画面 是我的子画面
    grid_homon_saki 就是我这个画面的 DATAGRIDVIEW
      

  13.   

    我给你理下思路 
    你把要绑定的东西 查出来  放到个list_a里面
    for (int no = 0; no < list_a.count; no++)
                     {
    temptable.Rows.Add(list_a[no])
    }
    这样就把整列的COMB 都绑定上了这一组数据了
    至于查出来其他初始值  和 更新进去的时候 就已经和原来这一列 是不是COMB 关联不大了 和是TEXT形式的做法是一样 一样的了
      

  14.   

    DataGridView中的DataGridViewComboBoxColumn这比较麻烦些,需先对数据进行处理再绑定。
      

  15.   

    COMBOBOX是绑定上去了,下拉菜单数据也有了
    就是查出来原始记录这一列还是不显示
    我现在只要图形化界面一设置DataPropertyName 
    或者加代码
    this.dataGridView2.Columns[1].DataPropertyName = "Shipdate";都会报错,不加,它就在我后面再添加SELECT出来的字段名
      

  16.   

    问题解决了
    ((DataGridViewComboBoxColumn)dataGridView2.Columns[1]).DisplayMember = "Name";
    ((DataGridViewComboBoxColumn)dataGridView2.Columns[1]).ValueMember = "Name";因为我数据库里放的也值,所以这里也要写值,不能写value