有一个数据库的表,将其绑定到DataGridView控件上,其中有一列的数据我想通过下拉列表去修改,下拉之后显示的数据是该列的distinct的数据。当然我说的意思不是直接在columns上Add或者insert一列——下拉框DataGridViewComboBoxColumn,我希望在已有的列上通过点击,出现ComboBox,并选择不同的值,更新数据库。
不知道如何实现,最好有源代码或者示例!以前玩过一点PB,他的DW是很强大的,有这个功能,但是对C#的DataGridView不太了解,是否可以实现呢?急求,万分感谢!

解决方案 »

  1.   

    实例一个Combobox,在dgv的CellMouseEnter事件里为这个Combobox绑定数据,然后把他显示在这个cell上,你可以用e.CellBounds获得一个Rectangle
    给这个combobox写SelectedIndexChanged事件来修改数据
    然后在CellMouseLeave里把e.value=combobox.text,然后隐藏combobox就可以了
      

  2.   

    给你写了一个,你看看符不符合你要求吧
            private void Form1_Load(object sender, EventArgs e)
            {
                dataGridView1.AllowUserToAddRows = false;
                dataGridView1.Columns.Add("c1", "姓名");
                dataGridView1.Columns.Add("c2", "性别");
                dataGridView1.Rows.Add("张一");
                dataGridView1.Rows.Add("李二");
                dataGridView1.Rows.Add("王三");
                dataGridView1.Rows.Add("孙四");
                dataGridView1.Rows.Add("刘五");
                dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick);
            }        void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.ColumnIndex != 1 || e.RowIndex == -1)
                {
                    return;
                }
                DataGridViewCell cell = dataGridView1[e.ColumnIndex, e.RowIndex];            Rectangle ret = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);
                cb = new ComboBox();
                this.cb.Location = new System.Drawing.Point(ret.X + dataGridView1.Location.X, ret.Y + dataGridView1.Location.Y);
                this.cb.Size = cell.Size;
                cb.Tag = cell;
                            cb.Items.Add("男");
                cb.Items.Add("女");
                cb.Items.Add("人妖");            this.Controls.Add(cb);
                this.Controls.SetChildIndex(cb, 0);            cb.SelectedIndexChanged += new EventHandler(cb_SelectedIndexChanged);
            }        private ComboBox cb;        void cb_SelectedIndexChanged(object sender, EventArgs e)
            {
                cb = (ComboBox)sender;
                DataGridViewCell cell = (DataGridViewCell)cb.Tag;
                cell.Value = cb.Text;
                Controls.Remove(cb);
            }
      

  3.   

    非常感谢楼上,就是通过您的方法我实现了我说的功能。
    现将我写实现和测试过的代码写下来,共享一下~~private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.ColumnIndex < 0 || e.RowIndex < 0)
                {
                    return;
                }            DataGridViewCell cell = dataGridView[e.ColumnIndex, e.RowIndex];
                Rectangle ret = dataGridView.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);            if (e.ColumnIndex == 1)
                {
                    cmbEquipCat = new ComboBox();
                    cmbEquipCat.DropDownHeight = 212;
                    this.cmbEquipCat.Location = new System.Drawing.Point(
                        ret.X + dataGridView.Location.X, ret.Y + dataGridView.Location.Y);
                    this.cmbEquipCat.Size = cell.Size;
                    cmbEquipCat.Tag = cell;
                    SqlDataAdapter EquipCat = new SqlDataAdapter("SELECT DISTINCT " +
                    "FL_EquipCat as 设备类别 FROM Fault WHERE FL_EquipCat <> '未知设备' OR " +
                    " FL_EquipCat <> NULL ", connSQLServer);
                    DataTable dtEquipCat = new DataTable("Fault");
                    EquipCat.Fill(dtEquipCat);
                    cmbEquipCat.DataSource = dtEquipCat;
                    cmbEquipCat.DisplayMember = "设备类别";
                    cmbEquipCat.ValueMember = "设备类别";
                    this.Controls.Add(cmbEquipCat);
                    this.Controls.SetChildIndex(cmbEquipCat, 0);                cmbEquipCat.SelectedIndexChanged += new EventHandler(cmbEquipCat_SelectedIndexChanged);
                }
                else if (e.ColumnIndex == 2)
                {
                    cmbEquipType = new ComboBox();
                    cmbEquipType.DropDownHeight = 212;
                    this.cmbEquipType.Location = new System.Drawing.Point(
                        ret.X + dataGridView.Location.X, ret.Y + dataGridView.Location.Y);
                    this.cmbEquipType.Size = cell.Size;
                    cmbEquipType.Tag = cell;
                    SqlDataAdapter sdaEquipType = new SqlDataAdapter("SELECT DISTINCT " +
                    "FL_EquipType as 设备型号 FROM Fault WHERE FL_EquipType <> '未知设备' OR " +
                    " FL_EquipType <> NULL ", connSQLServer);
                    DataTable dtEquipType = new DataTable("Fault");
                    sdaEquipType.Fill(dtEquipType);
                    cmbEquipType.DataSource = dtEquipType;
                    cmbEquipType.DisplayMember = "设备型号";
                    cmbEquipType.ValueMember = "设备型号";
                    this.Controls.Add(cmbEquipType);
                    this.Controls.SetChildIndex(cmbEquipType, 0);
                    cmbEquipType.SelectedIndexChanged += new EventHandler(cmbEquipType_SelectedIndexChanged);
                }
                else
                {
                    return;
                }
            }        void cmbEquipCat_SelectedIndexChanged(object sender, EventArgs e)
            {
                cmbEquipCat = (ComboBox)sender;
                DataGridViewCell cell = (DataGridViewCell)cmbEquipCat.Tag;
                cell.Value = cmbEquipCat.Text;
                Controls.Remove(cmbEquipCat);
                cmbEquipCat.Visible = false;
            }        void cmbEquipType_SelectedIndexChanged(object sender, EventArgs e)
            {
                cmbEquipType = (ComboBox)sender;
                DataGridViewCell cell = (DataGridViewCell)cmbEquipType.Tag;
                cell.Value = cmbEquipType.Text;
                Controls.Remove(cmbEquipType);
                cmbEquipType.Visible = false;
            }