DataGridViewComboBoxCell数据源为空

时间:2017-08-03 15:22:18

标签: c# datagridview combobox

我有一个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

我使用将数据表加载到网格中的示例更新了原始代码。

1 个答案:

答案 0 :(得分:0)

在我的项目上运行如下: 为源数组创建一个类。 将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;
    }

}
}