我目前正在尝试将一个ComboBox添加到dataGridView。
在DGV中,共有5列:复选框,字符串,字符串,组合框,组合框。
两个组合框列都配置为datagridviewcomboboxcolumns(通过VisualStudio设计器)。我的问题是添加行。
我目前的尝试是:列已经定义,我通过dataGridView.Rows.Add添加行。 为此,我正在使用一组对象。例如:
dataGridViewRow row = new dataGridViewRow();
object[] obj = new object[5] {true, "str1", "str2", null, null};
dataGridView1.Rows.Add(obj);
这没有任何错误。但从逻辑上讲,组合框没有任何东西。
我尝试将数据源设置为一行的第4和第5个单元格:
错误...使用ROW.dataGridViewComboBoxCell.Items.Add:不显示项目......
使用新的DGVcomboBoxCell或-Column填充obj [3]和4:
Error... :The error message says "The dataGridViewComboBoxCell-Value is invalid.
更多信息:每个列在组合框中应该具有相同的项目。 (这些以前是通过互联网加载的,如xml)。将dataSource设置为两列会破坏整个DGV(我想因为其他colmns没有数据源)。 简而言之:如何将行添加到包含填充项目的组合框的DGV中?
此致 NOMAD
编辑:这是解决我问题的一些代码:
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);
首先添加一行,投射列,配置它们并将它们添加到行中。 之前需要在设计器中指定No Columns。
答案 0 :(得分:4)
您可以使用此解决方案将项目添加到datagird视图组合框列
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)
}
如果上述方法无效,请查看以下解决方案。
你可以通过DataGridViewComboBoxCell来做到这一点。根据单元格的rowIndex,将不同的数据源(string [])设置为不同的DataGridViewComboBoxCell。编码如下:
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;
}
}
}
}
答案 1 :(得分:1)
我并不完全清楚你要在这里做什么,但是如果你只是想为你添加的每一行从组合框中选择一个值,你可以选择一个现有的组合框值作为字符串。 / p>
如果我有一个两列datagridview,两个都有预先填充的组合框(我在datagridview控件中填充了我的组合框,只需编辑每一列并在那里添加我的选择),那么我可以这样做:
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
所以“Foo”和“Bar”已经是组合框中的选择。我可以通过简单地引用我想要的名称来填充每一行。如果我愿意,我猜我也可以通过索引号来做到这一点。
希望这有帮助!
答案 2 :(得分:0)
如果您需要保留已配置的列,请尝试以下操作:
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;
值1和2仅为示例。它必须是DataGridViewComboBoxColumn.ValueMember的类型。我正在寻找这个话题,所以 我以为有人可以使用它。