有一个数据库的表,将其绑定到DataGridView控件上,其中有一列的数据我想通过下拉列表去修改,下拉之后显示的数据是该列的distinct的数据。当然我说的意思不是直接在columns上Add或者insert一列——下拉框DataGridViewComboBoxColumn,我希望在已有的列上通过点击,出现ComboBox,并选择不同的值,更新数据库。
不知道如何实现,最好有源代码或者示例!以前玩过一点PB,他的DW是很强大的,有这个功能,但是对C#的DataGridView不太了解,是否可以实现呢?急求,万分感谢!
给这个combobox写SelectedIndexChanged事件来修改数据
然后在CellMouseLeave里把e.value=combobox.text,然后隐藏combobox就可以了
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);
}
现将我写实现和测试过的代码写下来,共享一下~~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;
}