请教个问题,我想让DataGridView中的其中一列为ComboBox,如何实现呢?其中ComboBox中的项是从数据库中取的.例如value为col1,text为col2.
如果直接在界面上放一个ComboBox,类似于WebForm中DropDownList有Key和Value我已经知道怎么弄了,但不知如何放到DataGridView中看了一些DataGridViewComboBoxColumn的资料,不得要领.好像是可以用DataGridView中的Add或Insert方法在现有表格中加一列吧,但我想在已经设好的列中放...谢谢~~~~~

解决方案 »

  1.   

    还是很简单的
    代码如下:
    DataGridViewColumn Column = new DataGridViewComboBoxColumn();
    Column.Width = 110;
    foreach (System.Data.DataRow row in YourDataTable.Rows)
    {
        ((DataGridViewComboBoxColumn)Column).Items.Add(row["FieldName"]);
    }
    DataGridView.Columns.Add(Column)
      

  2.   

    另:如果需要ComboBox有Key和Value的话,那么你可以创建一个继承于DataGridViewComboBoxColumn的新类,比如
    MyDataGridViewComboBoxColumn
      

  3.   

    DataGridViewComboBoxColumn rr = new DataGridViewComboBoxColumn();
                rr.Name = "combobox";
                rr.DataSource=你从数据库获取的数据;
                rr.DisplayMember="col2";
                rr.ValueMember="col1"
                rr.Items.Add("ss");//也可以自己添加的数据
                rr.Items.Add("hh");//也可以自己添加的数据
                this.dataGridView1.Columns.Add(rr);
      

  4.   

    谢谢两位.还有个问题.我在界面上添加一个datagridview,其中设了10列.我想让其中的某一列为datagridview,在绑定之后还是10列而不是新增后的11列
    这样可以吗?另外,Winform的datagridview里可以较简便的实现webform的gridview那种模板列的功能吗?例如我在某列里放两个commbobox
      

  5.   

    问题好象已经解决了    如果楼主 需要 绑定数据的 datagridview 和绑定列的插入的代码我可以给你一个事例   需要就CALL 我我是小菜鸟!   说的不好清见谅,   希望能够帮到你!
      

  6.   

    又有个小问题,我把需要放combobox的那列在设计器里删掉了,之后在代码里用columns.add动态添加绑定datasource的combobox,但页面会自动触发CellValidating事件
    因为有些列是不能为空的,所以这时调CellValidating就报错了
      

  7.   

    其实我想了解的是,能不能不用我在7#说的这种方法,先在设计器里把相应的列移除,在程序里来insert
    而是直接在代码里把绑定datasource的combobox(或者datagridviewcomboboxcolumn)来"绑定"到那列中呵呵,不知怎么描述好
      

  8.   

    给楼主一段代码,不知道能用上不?
     DataTable dt = new DataTable();
                
                dt.Columns.Add("txt");
                dt.Columns.Add("vae");            DataRow dr;
                for (int i = 0; i <= keyname.Length - 1; i++)
                {
                    dr = dt.NewRow();
                    dr[0] = keyname[i].ToString();
                    dr[1] = keycol[i].ToString();
                    dt.Rows.Add(dr);
                }            comboBox1.DataSource = dt;
                comboBox1.DisplayMember = "txt";
                comboBox1.ValueMember = "vae";
      

  9.   

    谢谢楼上,不过还是不明白怎么能加到datagridview已经在设计器里设计好的列中,呵呵
      

  10.   

    原来是在.net版有43分,没想到水版的也可以用,呵呵~+100分,大家帮帮小弟啊~
      

  11.   

    我记得  我发给LZ一个示例了    LZ想要的效果 还没实现吗?想要啥样的呢?  纯动态的吗?   那就是集合的运用了  把那个示例修改下就可以拉我是小菜鸟!   说的不好清见谅,   希望能够帮到你!
      

  12.   


    谢谢super兄弟,如果直接在DataGridViewComboBoxColumn中的Items增加数据就容易些了,可我想在这个列中的ComboBox中绑定的是一个数据源的东西,貌似做法有些不同~
      

  13.   

    good good study
    day day up
      

  14.   

    其实还是1楼那个问题
    =============
    看了一些DataGridViewComboBoxColumn的资料,不得要领.好像是可以用DataGridView中的Add或Insert方法在现有表格中加一列吧,但我想在已经设好的列中放... 谢谢~~~~~
    =============
      

  15.   

    我想知道类似的答案,不过是在windows form中,不是在web下
      

  16.   

    谢谢Guyschaos不过还想了解一下有没有更简便些的方法,就是将combobox或comboboxcolumn绑定数据源,再让datagridview中的指定列对它来进行绑定.类似于这种思路,不知有没有~再观望一下...不会太久的,呵呵~
      

  17.   

    private void button2_Click(object sender, EventArgs e)
            {
                DataGridViewComboBoxColumn ss = new DataGridViewComboBoxColumn();
                ss.Name = "combobox";
                ss.DataSource = "绑定的数据源";//这个你可以自己写,要是你不清楚怎么写告诉我好了!
                ss.DisplayMember = "字段1";
                ss.ValueMember = "字段";
                this.dataGridView1.Columns.Add(ss);
            }
      

  18.   

    Guyschaos,我的msn是[email protected],如果方便的话可以加一下我吗?这上面可能容易说些~
      

  19.   

    我公司不能上QQ或者MSN!不好意思
      

  20.   

    我想办法描述一下吧~如果用...Columns.Add()或者Insert(),会在我设计器里设计好的DataGridView中增加一列.也就是说,我在最初设计列的时候,就不能有这一列了,而必须在代码中动态增加.
    我想知道的是可不可以用类似DataGridView.Columns.XXX=comboBox1的方式,直接把已绑定数据源的ComboBox"添"到我所需要的这个Column中
    因为在WebForm中,GridView的模板列是比较容易实现这一功能的,所以想了解一下WinForm中是不是也可以这样~ps,还有一个原因是我在7#说的,用add会引发CellValidating事件(不知道我YY的那种方法会不会也有)~当然这属于另一个问题,如果一定要用add或insert,我会另外开贴的~
      

  21.   

    再次感谢Guyschaos和其他XDJM的帮助~
      

  22.   

    在web编程中,要想灵活控制表格最好不要用DataGridView,我用的就是REPEATER,需要什么控件就加什么控件。
      

  23.   

              DataGridViewComboBoxColumn ss = new DataGridViewComboBoxColumn(); 
                ss.Name = "combobox"; 
                ss.DataSource = "绑定的数据源";
                ss.DisplayMember = "字段1"; 
                ss.ValueMember = "字段"; 
    在winform中也是这么实现的
      

  24.   

    恩,那么这列如何和某个column来绑定呢?如果不用add或insert的话~
      

  25.   

    public ComboBox com_work_name = new ComboBox();
    private void databindworktype()
            {
                com_work_name.Items.AddRange(new object[] { "会计", "出纳", "会计师", "软件工程师", "财务主管", "网络工程师" });
                com_work_name.DropDownStyle = ComboBoxStyle.DropDownList;
                com_work_name.Visible = false;
                com_work_name.SelectedIndexChanged += new EventHandler(com_work_name_SelectedIndexChanged);
                dgvEmployeeList.Controls.Add(com_work_name);
            }
    private void com_work_name_SelectedIndexChanged(object sender, EventArgs e)
            {
                try
                {
                    if (com_work_name.SelectedIndex != -1)
                    {
                        dgvEmployeeList.CurrentCell.Value = com_work_name.Text;
                    }
                }
                catch { }
            }
    其中dgvEmployeeList是一个datagridview控件
    private void dgvEmployeeList_CurrentCellChanged(object sender, EventArgs e)
            {
                try
                {
                    if (this.dgvEmployeeList.CurrentCell.ColumnIndex == 23)//指对应的列
                    {
                        Rectangle rec = dgvEmployeeList.GetCellDisplayRectangle(dgvEmployeeList.CurrentCell.ColumnIndex, dgvEmployeeList.CurrentCell.RowIndex, false);
                        com_work_name.Left = rec.Left;
                        com_work_name.Top = rec.Top;
                        com_work_name.Width = rec.Width;
                        com_work_name.Height = rec.Height;
                        com_work_name.Visible = true;
                    }
                    else
                    {
                        com_work_name.Visible = false;
                    }
                }
                catch { }
            }最后
    private void frmEmployee_Load(object sender, EventArgs e)
            {
                databindworkname();
            }
    frmEmployee是一个winform窗体名
    ,希望对楼主有所帮助!
      

  26.   

    private void databindsupply()
            {
                com_dept.DataSource = baseinfo.GetDeptName("tb_Dept").Tables[0].DefaultView;
                com_dept.ValueMember = "Name";
                com_dept.DisplayMember = "Name";
                com_dept.DropDownStyle = ComboBoxStyle.DropDownList;
                com_dept.Visible = false;
                com_dept.SelectedIndexChanged += new EventHandler(com_dept_SelectedIndexChanged);
                dgvEmployeeList.Controls.Add(com_dept);
            }
      

  27.   

    呵呵,冰島男孩的應該是樓主想要的,樓主都說了n多遍了是想把現有的列變成下拉風格的,大家還是一直回在datagridview中加一列。