我想把一个ComboBox绑定到一个DataGrideView里!请各位前辈指正我如何添加到相应的制定列里!并能制定值。
        private ComboBox cmb_Temp = new ComboBox();
       //这里是绑定ComboBox的值
        private void BindSex()
        {
            DataTable dtSex = new DataTable();
            dtSex.Columns.Add("Value");
            dtSex.Columns.Add("Name");
            DataRow drSex;
            drSex = dtSex.NewRow();
            drSex[0] = "1";
            drSex[1] = "男";
            dtSex.Rows.Add(drSex);
            drSex = dtSex.NewRow();
            drSex[0] = "0";
            drSex[1] = "女";
            dtSex.Rows.Add(drSex);
            cmb_Temp.ValueMember = "Value";
            cmb_Temp.DisplayMember = "Name";
            cmb_Temp.DataSource = dtSex;
            cmb_Temp.DropDownStyle = ComboBoxStyle.DropDownList;
        }
        //这里绑定DataGrideView的值
        private DataTable DataGridBindData()
        {
            DataTable dtData = new DataTable();
            dtData.Columns.Add("ID");
            dtData.Columns.Add("Name");
            dtData.Columns.Add("Sex");
            DataRow drData;
            drData = dtData.NewRow();
            drData[0] = 1;
            drData[1] = "张三";
            drData[2] = "1";
            dtData.Rows.Add(drData);
            drData = dtData.NewRow();
            drData[0] = 2;
            drData[1] = "李四";
            drData[2] = "1";
            dtData.Rows.Add(drData);
            drData = dtData.NewRow();
            drData[0] = 3;
            drData[1] = "王五";
            drData[2] = "1";
            dtData.Rows.Add(drData);
            drData = dtData.NewRow();
            drData[0] = 4;
            drData[1] = "小芳";
            drData[2] = "0";
            dtData.Rows.Add(drData);
            drData = dtData.NewRow();
            drData[0] = 5;
            drData[1] = "小娟";
            drData[2] = "0";
            dtData.Rows.Add(drData);
            drData = dtData.NewRow();
            drData[0] = 6;
            drData[1] = "赵六";
            drData[2] = "1";
            dtData.Rows.Add(drData);
            return dtData;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource =DataGridBindData();
            //下面应该怎么做!请各位前辈指正
                    //我想绑定到DataGrideView里第三列。
        }

解决方案 »

  1.   

    这是我以前写的代码,你可以看看在Load里面要先把需要显示到DataGridView的ComboBox Add到DataGridView里面参数说明currentCell:要显示ComboBox的DataGridViewCell (单元格)
    cmb:要显示的ComboBox控件
    private void DisplayComboBox(DataGridViewCell currentCell, ComboBox cmb)
            {
                Rectangle rect = dgvInputData.GetCellDisplayRectangle(currentCell.ColumnIndex, currentCell.RowIndex, false);
                cmb.Width = rect.Width;
                cmb.Height = rect.Height;
                cmb.Top = rect.Top;
                cmb.Left = rect.Left;
                cmb.Visible = true;
                if (currentCell.Value != null)
                    cmb.Text = currentCell.Value.ToString();
            }
      

  2.   

    那个combobox私有成员可以去掉了。  
     private void Form1_Load(object sender, EventArgs e)
            {
                this.dataGridView1.DataSource =DataGridBindData();
           
            DataTable dtSex = new DataTable();
                dtSex.Columns.Add("Value");
                dtSex.Columns.Add("Name");
                DataRow drSex;
                drSex = dtSex.NewRow();
                drSex[0] = "1";
                drSex[1] = "男";
                dtSex.Rows.Add(drSex);
                drSex = dtSex.NewRow();
                drSex[0] = "0";
                drSex[1] = "女";
                dtSex.Rows.Add(drSex);
                 ///
                DataGridViewComboBoxColumn cbx = new DataGridViewComboBoxColumn();
                cbx.DataSource = dtSex.DefaultView;
                cbx.ValueMember = "Value";
                cbx.DisplayMember = "Name";
                cbx.HeaderText = "Sex";
                this.dataGridView1.Columns.Add(cbx); }
      

  3.   

    用DataGridViewComboBoxColumn 的话 很多ComboBox特有的功能无法使用,用ComboBox的话,可以很好的对ComboBox进行控制,这是个很好的办法,一般的话,我觉得还是不用DataGridViewComboBoxColumn比较好。呵呵。
      

  4.   

    3楼的前辈!照你的方法!在第三列只有选择了之后才能出现下拉内容!并不是在load完了就显示!
      

  5.   

    2楼的前辈!在From_load事件里应该如何调用!那我怎么又绑定到第三列里
      

  6.   

    4楼前辈 DataGridViewComboBoxColumn 应该怎么用!
      

  7.   

    参考我上面发的链接是将time控件加到datagridview上面,同样你将它换成ComboBox一样可以用
      

  8.   


    我发的连接你看不懂?照上面的做就是啦,将time控件换成ComboBox就是了
      

  9.   

    在GridView控件的数据绑定时间里加上就行了。
      

  10.   

    这是在DataGridView的第一列添加ComboBox的:
            string str2 = "SELECT Top 10 Title, EmployeeID, ReportsTo, PostalCode FROM Employees";
            private DataTable GetData(string strSQl)
            {
                DataTable dtData = new DataTable();
                using (SqlConnection thisConnection = new SqlConnection(
                   @"Data Source=.;Initial Catalog=Northwind;Integrated Security=True"))
                {
                    using (SqlDataAdapter thisAdapter = new SqlDataAdapter(
                        strSQl, thisConnection))
                    {
                        thisAdapter.Fill(dtData);
                    }
                    thisConnection.Close();
                }
                return dtData;
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                DataTable dtSource = GetData(str2);
                this.dataGridView1.Columns.Add("Title", "Title");
                this.dataGridView1.Columns.Add("EmployeeID", "EmployeeID");
                this.dataGridView1.Columns.Add("ReportsTo", "ReportsTo");
                this.dataGridView1.Columns.Add("PostalCode", "PostalCode");
                this.dataGridView1.Columns[0].Width = 200;            foreach (DataRow dr in dtSource.Rows)
                {
                    this.dataGridView1.Rows.Add(dr[0], dr[1], dr[2], dr[3]);
                }            ExDataGridView exDgv = new ExDataGridView(this.dataGridView1, dtSource);
                exDgv.BindControl();
            }    /// <summary>
        /// DataGridView的扩展: 在DataGridView上添加子控件
        /// </summary>
        public class ExDataGridView
        {
            private ComboBox cbTitle = new ComboBox();        private DataGridView dtModel;                           // DataGridView实例
            private DataTable dtSource = null;                      // 数据表
            private BindingSource tBindingSource = null;            // 绑定源        public ExDataGridView(DataGridView model,DataTable source)
            {
                this.dtModel = model;
                this.dtSource = source;
            }        /// <summary>
            ///  在DataGridView上绑定控件
            /// </summary>
            public void BindControl()
            {
                this.tBindingSource = new BindingSource();
                this.tBindingSource.DataSource = this.dtSource.DefaultView;            this.cbTitle.Visible = false;          //置控件为不可见属性
                this.dtModel.Controls.Add(cbTitle);            this.cbTitle.DisplayMember = "Title";
                this.cbTitle.DataSource = tBindingSource.DataSource;
                this.cbTitle.DropDownStyle = ComboBoxStyle.DropDown;
                this.cbTitle.SelectedIndexChanged += new EventHandler(Combox_SelectedIndexChanged);            this.dtModel.ReadOnly = true;
                this.dtModel.CurrentCellChanged += new EventHandler(DataGridView_CurrentCellChanged);
                this.dtModel.Scroll += new ScrollEventHandler(DataGridView_Scroll);
                this.dtModel.ColumnWidthChanged += new DataGridViewColumnEventHandler(DataGridView_ColumnWidthChanged);
            }        #region 私有的方法
            //隐藏指定控件
            private void HideControl()
            {
                this.cbTitle.Visible = false;
            }
            // 当用户单击至指定位置时显示相应控件
            private void DataGridView_CurrentCellChanged(object sender, EventArgs e)
            {
                HideControl();            //得到单元格表示区域的矩形
                if (this.dtModel.CurrentCell == null)
                    return;
                Rectangle rect = this.dtModel.GetCellDisplayRectangle(this.dtModel.CurrentCell.ColumnIndex,
                    this.dtModel.CurrentCell.RowIndex, false);            string cellValue = (this.dtModel.CurrentCell.Value == null) ? string.Empty :
                this.dtModel.CurrentCell.Value.ToString();            if (this.dtModel.CurrentCell.ColumnIndex == 0)         // 单击第一列时显示列表控件
                {
                    this.cbTitle.Location = new Point(rect.Left, rect.Top);
                    this.cbTitle.Size = new Size(rect.Width, rect.Height);
                    this.cbTitle.BackColor = Color.Yellow;
                    this.cbTitle.Visible = true;
                    this.cbTitle.Text = cellValue;
                }
            }
            //  滚动DataGridView时将下拉列表框设为不可见
            private void DataGridView_Scroll(object sender, ScrollEventArgs e)
            {
                HideControl();
            }
            //  改变DataGridView列宽时将下拉列表框设为不可见
            private void DataGridView_ColumnWidthChanged(object sender, DataGridViewColumnEventArgs e)
            {
                HideControl();
            }
            //  当用户选择下拉列表框时改变DataGridView单元格的内容
            private void Combox_SelectedIndexChanged(object sender, EventArgs e)
            {
                this.dtModel.CurrentCell.Value = ((ComboBox)sender).Text;
            }
            #endregion
        }
      

  11.   

    不知道是不是你要的。
            DataGridViewComboBoxColumn cmb_Temp = new DataGridViewComboBoxColumn();
            DataGridViewTextBoxColumn text1 = new DataGridViewTextBoxColumn();
            DataGridViewTextBoxColumn text2 = new DataGridViewTextBoxColumn();
            //这里是绑定ComboBox的值
            DataTable BindSex()
            {
                DataTable dtSex = new DataTable();
                dtSex.Columns.Add("Value");
                dtSex.Columns.Add("Name");
                DataRow drSex;
                drSex = dtSex.NewRow();
                drSex[0] = "1";
                drSex[1] = "男";
                dtSex.Rows.Add(drSex);
                drSex = dtSex.NewRow();
                drSex[0] = "0";
                drSex[1] = "女";
                dtSex.Rows.Add(drSex);
                return dtSex;
            }
            //这里绑定DataGrideView的值
            DataTable DataGridBindData()
            {
                DataTable dtData = new DataTable();
                dtData.Columns.Add("ID");
                dtData.Columns.Add("Name");
                dtData.Columns.Add("Sex");
                DataRow drData;
                drData = dtData.NewRow();
                drData[0] = 1;
                drData[1] = "张三";
                drData[2] = "1";
                dtData.Rows.Add(drData);
                drData = dtData.NewRow();
                drData[0] = 2;
                drData[1] = "李四";
                drData[2] = "1";
                dtData.Rows.Add(drData);
                drData = dtData.NewRow();
                drData[0] = 3;
                drData[1] = "王五";
                drData[2] = "1";
                dtData.Rows.Add(drData);
                drData = dtData.NewRow();
                drData[0] = 4;
                drData[1] = "小芳";
                drData[2] = "0";
                dtData.Rows.Add(drData);
                drData = dtData.NewRow();
                drData[0] = 5;
                drData[1] = "小娟";
                drData[2] = "0";
                dtData.Rows.Add(drData);
                drData = dtData.NewRow();
                drData[0] = 6;
                drData[1] = "赵六";
                drData[2] = "1";
                dtData.Rows.Add(drData);
                return dtData;
            }        private void Form2_Load(object sender, EventArgs e)
            {
                text1.DataPropertyName = "ID";
                text1.HeaderText = "ID";
                text2.DataPropertyName = "Name";
                text2.HeaderText = "Name";
                cmb_Temp.DataPropertyName = "Sex";
                cmb_Temp.DisplayMember = "Name";
                cmb_Temp.ValueMember = "Value";
                cmb_Temp.HeaderText = "Sex";
                cmb_Temp.DataSource = BindSex();            dataGridView1.Columns.AddRange(new DataGridViewColumn[] { text1, text2, cmb_Temp });
                dataGridView1.DataSource = DataGridBindData();
            }
      

  12.   

    要么用combox列好么

            public Form1()
            {
                InitializeComponent();            this.dataGridView1.DataSource = DataGridBindData();
                this.dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
                cmb_Temp.KeyPress += new KeyPressEventHandler(cmb_Temp_KeyPress);
                cmb_Temp.FlatStyle = FlatStyle.Flat;
            }        void cmb_Temp_KeyPress(object sender, KeyPressEventArgs e)
            {
                DataGridView DGV = (DataGridView)sender;            DGV.CurrentCell.Value = cmb_Temp.Text;
            }        void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                DataGridView DGV=(DataGridView )sender ;            if (DGV.Columns [ DGV.CurrentCell.ColumnIndex].DataPropertyName =="Sex")
                {
                    cmb_Temp.Text = e.Control.Text;                cmb_Temp.Parent = DGV.EditingPanel;
                    cmb_Temp.Size = DGV.GetCellDisplayRectangle(DGV.CurrentCell.ColumnIndex,
                        DGV.CurrentCell.RowIndex, false).Size;
                    cmb_Temp.BringToFront();                BindSex();
                }
            }
      

  13.   

    #15楼前辈~  您的代码我能通过验证!但是DataGrideView一加载显示的sex是0、1这样的项!
    当点击一下才出来下拉框男、女!
      

  14.   

    我不一定非得用ComboBox是下拉框就行!我要的结果如下示例:
    id  Name  Sex
    1    张三   男(下拉)
    2    李四   男(下拉)
    3    王五   男(下拉)
    4    小芳   女(下拉)也就是这样的结果!
      

  15.   

    #14楼的前辈您的代码可以用!但是有一个小小的问题!这里绑定的DataGrideView下面还有空行,空行里也有一个下拉框能去掉吗!因为DataTable里有六条数据,DataGrideView总富余出来一行怎么办!
      

  16.   

    加一句   
    dataGridView1.AllowUserToAddRows = false;
      

  17.   

    哦~~行了!那您的意思就是每一列都得指定它的类型了!
    DataGridViewComboBoxColumn cmb_Temp = new DataGridViewComboBoxColumn();
            DataGridViewTextBoxColumn text1 = new DataGridViewTextBoxColumn();
            DataGridViewTextBoxColumn text2 = new DataGridViewTextBoxColumn();
      

  18.   

    可以不用text1和text2
    dataGridView1.Columns.AddRange(new DataGridViewColumn[] { cmb_Temp });
      

  19.   


    那要加个事件了,而且其它部分也要改
    public Form1()
            {
                InitializeComponent();            this.dataGridView1.DataSource = DataGridBindData();
                this.dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
                cmb_Temp.DropDownClosed += new EventHandler(cmb_Temp_DropDownClosed);
                cmb_Temp.FlatStyle = FlatStyle.Flat;            cmb_Temp.Parent = this; // 让绑定起作用,第一次SelectedValue才有效
                cmb_Temp.Visible = false;
                BindSex();            this.dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting);
            }        void cmb_Temp_DropDownClosed(object sender, EventArgs e)
            {
                this.dataGridView1.CurrentCell.Value = cmb_Temp.SelectedValue;
            }        void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {
                DataGridView DGV = (DataGridView)sender;            if (DGV.Columns[e.ColumnIndex].DataPropertyName == "Sex")
                    if (e.Value != null)
                        if (e.Value.ToString() == "1")
                            e.Value = "男";
                        else if (e.Value.ToString() == "0")
                            e.Value = "女";        }        void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                DataGridView DGV = (DataGridView)sender;            cmb_Temp.Visible = true;            if (DGV.Columns[DGV.CurrentCell.ColumnIndex].DataPropertyName == "Sex")
                {
                    if (e.Control.Text == "男")
                        cmb_Temp.SelectedValue = 1;
                    else if (e.Control.Text == "女")
                        cmb_Temp.SelectedValue = 0;                cmb_Temp.Parent = DGV.EditingPanel;
                    cmb_Temp.Size = DGV.GetCellDisplayRectangle(DGV.CurrentCell.ColumnIndex,
                        DGV.CurrentCell.RowIndex, false).Size;
                    cmb_Temp.BringToFront();
                }
            }
      

  20.   

    把DataGrideView的 AllowUserToAddRows 属性设置为 False 就行了。