问题
I'm currently trying to add a ComboBox to a dataGridView.
In the DGV, there are 5 columns: checkbox, string, string, combobox, combobox.
both combobox-columns are configured as datagridviewcomboboxcolumns (via VisualStudio designer). My problem is to add rows.
My current try is: the columns are already defined and I add rows via dataGridView.Rows.Add. For that, I'm using an array of objects. Example:
dataGridViewRow row = new dataGridViewRow();
object[] obj = new object[5] {true, "str1", "str2", null, null};
dataGridView1.Rows.Add(obj);
This passes without any errors. But logically, the comboBoxes aren't filled with anything.
I tried setting a datasource to the 4th and 5th cell of a row:
Error...Using ROW.dataGridViewComboBoxCell.Items.Add: Items are not displayed...
filling obj[3] and 4 with a new DGVcomboBoxCell or -Column:
Error... :The error message says "The dataGridViewComboBoxCell-Value is invalid.
Further information: Each column should have the same Items in the comboBoxes. (These are previously loaded via internet, as xml). Setting a dataSource to the two columns destroys the whole DGV (I think because the other colmns don't have a Datasource). In a nutshell: How to add Rows to a DGV which contain comboboxes filled with items?
Sincerely, NoMad
edit: here's some code to solve my problem:
DataGridViewCheckBoxColumn check = new DataGridViewCheckBoxColumn();
check.Name = "Col1";
dataGridView1.Columns.Add(check);
dataGridView1.ColumnCount = 3;
dataGridView1.Columns[1].Name = "Col2";
dataGridView1.Columns[2].Name = "Col3";
object[] row = new object[] { true, "str1", "str2" };
dataGridView1.Rows.Add(row);
DataGridViewComboBoxColumn combo1 = new DataGridViewComboBoxColumn();
DataGridViewComboBoxColumn combo2 = new DataGridViewComboBoxColumn();
combo1.Name = "Col4";
combo1.Items.Add("100x100");
combo1.Items.Add("200x200");
combo2.Name = "Col5";
combo2.Items.Add("option1");
combo2.Items.Add("option2");
dataGridView1.Columns.Add(combo1);
dataGridView1.Columns.Add(combo2);
First add a row, cast columns, configure them and add them to the row. No Columns need to be previously specified in the designer.
回答1:
You can use this solution for adding items to datagird view combobox column
DataSet ds; //class variable
public Form1()
{
InitializeComponent();
ds = new DataSet();
//column 1 (normal textColumn):
dataGridView1.Columns.Add("col1", "Column1");
//column 2 (comboBox):
DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn();
comboCol.Name = "cmbColumn";
comboCol.HeaderText = "combobox column";
dataGridView1.Columns.Add(comboCol);
//using dataTable for each datasource:
for (int i = 0; i < 10; i++)
{
string text = "item " + i; //data for text
int[] data = { 1 * i, 2 * i, 3 * i }; //data for comboBox:
//create new dataTable:
DataTable table = new DataTable("table" + i);
table.Columns.Add("column1", typeof(string));
//fillig rows:
foreach (int item in data)
table.Rows.Add(item);
//add table to dataSet:
ds.Tables.Add(table);
//creating new row in dgv (text and comboBox):
CreateCustomComboBoxDataSouce(i, text, table);
}
}
private void CreateCustomComboBoxDataSouce(int row, string texst, DataTable table) //row index ,and two parameters
{
dataGridView1.Rows.Add(texst);
DataGridViewComboBoxCell comboCell = dataGridView1[1, row] as DataGridViewComboBoxCell;
comboCell.DataSource = new BindingSource(table, null);
comboCell.DisplayMember = "column1"; //name of column indataTable to display!!
comboCell.ValueMember = "column1"; // vlaue if needed
//(mostly you used these two propertes like: Name as DisplayMember, and Id as ValueMember)
}
if the above is not working take a look at the solution below..
you can do it via DataGridViewComboBoxCell. According to the cell's rowIndex, set different datasource(string[]) to the different DataGridViewComboBoxCell. Coding like this:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 0)
{
DataGridViewComboBoxCell combo = this.dataGridView1[0, e.RowIndex] as DataGridViewComboBoxCell;
if (e.RowIndex == 0)
{
//these data will be displayed in comboBox:
string[] data= {"item A1", "item B1", "item C1"};
combo.DataSource = data;
}
if (e.RowIndex == 1)
{
//these data will be displayed in comboBox:
string[] data = {"item A2", "item B2", "item C2"};
combo.DataSource = data;
}
if (e.RowIndex == 2)
{
//these data will be displayed in comboBox:
string[] data = { "item A3", "item B3", "item C3" };
combo.DataSource = data;
}
}
}
}
回答2:
I'm not entirely clear what you're trying to do here, but if you're just trying to choose a value from the combobox for each row you add, you can choose an existing combobox value as a string.
If I have a two column datagridview, both with comboboxes that are pre-populated (I populated my comboboxes in the datagridview control itself by simply editing each column and adding my choices to the collection there), then I can do this:
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim newRow(1) As Object
newRow(0) = "Foo"
newRow(1) = "Bar"
DataGridView1.Rows.Add(newRow)
End Sub
End Class
So "Foo" and "Bar" are already choices in the comboboxes. I can populate each row by simply referring to the choice I want by name. I would guess I could also do this by index number if I wanted to.
Hope this helps!
回答3:
If you need to keep configured columns try something like this:
dataGridView1.Rows.Add();
DataGridViewRow tmp = dataGridView1.Rows[dgvMatw.Rows.Count - 1];
tmp.Cells[0] = true;
tmp.Cells[1] = "str1";
tmp.Cells[2] = "str2";
((DataGridViewComboBoxCell)tmp.Cells[3]).Value = 1;
((DataGridViewComboBoxCell)tmp.Cells[4]).Value = 2;
Values 1 and 2 where example only. It must be type of your DataGridViewComboBoxColumn.ValueMember. I was searching for this topic, so I thought someone could use it.
来源:https://stackoverflow.com/questions/7704137/c-sharp-add-a-dgv-row-with-a-datagridviewcomboboxcell