我有一个DataGridView
,列作为ComboBox
,这是我用来创建列并为每一行更新DataSource
的代码。
var dTable = new DataTable();
dTable.Columns.Add("Id",typeof(int));
dTable.Columns.Add("Desc", typeof(string));
for (int i = 0; i < 10; i++)
{
var dRow = dTable.NewRow();
dRow[0] = i;
dRow[1] = "test";
dTable.Rows.Add(dRow);
}
dataGridView1.DataSource = dTable;
//Create the ComboBoxColumn at the end of the grid
var cmb = new DataGridViewComboBoxColumn();
cmb.Name = "ComboCol";
cmb.HeaderText = "ComboCol";
dataGridView1.Columns.Add(cmb);
UpdateDataSourceCombo();
private void UpdateDataSourceCombo()
{
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
var comboCell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells["ComboCol"];
//Same datasource for every row just for testing
comboCell.DataSource = new string[] { "a", "b", "c" };
}
}
列被正确地创建为一个ComboBox
,但它始终是空的。
在进一步测试之后,更新了,我知道只有在对整个DGV使用数据源时才会出现问题。
如果我自己创建列,它会很好:
var test = new DataGridViewTextBoxColumn();
test.Name = "asd";
dataGridView1.Columns.Add(test);
dataGridView1.Rows.Add(new DataGridViewRow());
var cmb = new DataGridViewComboBoxColumn();
cmb.Name = "ComboCol";
cmb.HeaderText = "ComboCol";
dataGridView1.Columns.Add(cmb);
UpdateDataSourceCombo(); //Same function as the original post
我用datatable加载到网格的示例更新了原始代码。
发布于 2017-08-03 15:32:10
在我的项目上工作如下:为源数组创建一个类。设置DisplayMemberPath和组合框列的ValueMemberPath属性。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace sof
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
System.Data.DataTable dTable = new DataTable();
using (System.Data.SqlClient.SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=testBase;Integrated security=true"))
{
using (System.Data.SqlClient.SqlDataAdapter sqlAdp = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM City WHERE City_Name LIKE 'Chalon%'", sqlConn))
{
sqlConn.Open();
sqlAdp.Fill(dTable);
}
}
dataGridView1.DataSource = dTable;
//Create the ComboBoxColumn at the end of the grid
var cmb = new DataGridViewComboBoxColumn();
cmb.Name = "ComboCol";
cmb.HeaderText = "ComboCol";
cmb.DisplayMember = "Display";
cmb.ValueMember = "Value";
dataGridView1.Columns.Add(cmb);
UpdateDataSourceCombo();
}
private void UpdateDataSourceCombo()
{
for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
var comboCell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells["ComboCol"];
//Same datasource for every row just for testing
if (i % 2 == 0)
comboCell.DataSource = new customObj[] { new sof.customObj("a", "a"), new sof.customObj("b", "b"), new customObj("c", "c") };
else
comboCell.DataSource = new customObj[] { new sof.customObj("1", "1"), new sof.customObj("2", "2"), new customObj("3", "3") };
}
}
}
class customObj
{
public string Value { get; set; }
public string Display { get; set; }
public customObj(string value, string display)
{
this.Value = value;
this.Display = display;
}
}
}
https://stackoverflow.com/questions/45488470
复制相似问题