请教个问题,我想让DataGridView中的其中一列为ComboBox,如何实现呢?其中ComboBox中的项是从数据库中取的.例如value为col1,text为col2.
如果直接在界面上放一个ComboBox,类似于WebForm中DropDownList有Key和Value我已经知道怎么弄了,但不知如何放到DataGridView中看了一些DataGridViewComboBoxColumn的资料,不得要领.好像是可以用DataGridView中的Add或Insert方法在现有表格中加一列吧,但我想在已经设好的列中放...谢谢~~~~~
如果直接在界面上放一个ComboBox,类似于WebForm中DropDownList有Key和Value我已经知道怎么弄了,但不知如何放到DataGridView中看了一些DataGridViewComboBoxColumn的资料,不得要领.好像是可以用DataGridView中的Add或Insert方法在现有表格中加一列吧,但我想在已经设好的列中放...谢谢~~~~~
代码如下:
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)
MyDataGridViewComboBoxColumn
rr.Name = "combobox";
rr.DataSource=你从数据库获取的数据;
rr.DisplayMember="col2";
rr.ValueMember="col1"
rr.Items.Add("ss");//也可以自己添加的数据
rr.Items.Add("hh");//也可以自己添加的数据
this.dataGridView1.Columns.Add(rr);
这样可以吗?另外,Winform的datagridview里可以较简便的实现webform的gridview那种模板列的功能吗?例如我在某列里放两个commbobox
因为有些列是不能为空的,所以这时调CellValidating就报错了
而是直接在代码里把绑定datasource的combobox(或者datagridviewcomboboxcolumn)来"绑定"到那列中呵呵,不知怎么描述好
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";
谢谢super兄弟,如果直接在DataGridViewComboBoxColumn中的Items增加数据就容易些了,可我想在这个列中的ComboBox中绑定的是一个数据源的东西,貌似做法有些不同~
day day up
=============
看了一些DataGridViewComboBoxColumn的资料,不得要领.好像是可以用DataGridView中的Add或Insert方法在现有表格中加一列吧,但我想在已经设好的列中放... 谢谢~~~~~
=============
{
DataGridViewComboBoxColumn ss = new DataGridViewComboBoxColumn();
ss.Name = "combobox";
ss.DataSource = "绑定的数据源";//这个你可以自己写,要是你不清楚怎么写告诉我好了!
ss.DisplayMember = "字段1";
ss.ValueMember = "字段";
this.dataGridView1.Columns.Add(ss);
}
我想知道的是可不可以用类似DataGridView.Columns.XXX=comboBox1的方式,直接把已绑定数据源的ComboBox"添"到我所需要的这个Column中
因为在WebForm中,GridView的模板列是比较容易实现这一功能的,所以想了解一下WinForm中是不是也可以这样~ps,还有一个原因是我在7#说的,用add会引发CellValidating事件(不知道我YY的那种方法会不会也有)~当然这属于另一个问题,如果一定要用add或insert,我会另外开贴的~
ss.Name = "combobox";
ss.DataSource = "绑定的数据源";
ss.DisplayMember = "字段1";
ss.ValueMember = "字段";
在winform中也是这么实现的
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窗体名
,希望对楼主有所帮助!
{
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);
}