首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >DataGridViewComboBoxCell数据源空

DataGridViewComboBoxCell数据源空
EN

Stack Overflow用户
提问于 2017-08-03 15:22:18
回答 1查看 945关注 0票数 2

我有一个DataGridView,列作为ComboBox,这是我用来创建列并为每一行更新DataSource的代码。

代码语言:javascript
运行
复制
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使用数据源时才会出现问题。

如果我自己创建列,它会很好:

代码语言:javascript
运行
复制
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加载到网格的示例更新了原始代码。

EN

回答 1

Stack Overflow用户

发布于 2017-08-03 15:32:10

在我的项目上工作如下:为源数组创建一个类。设置DisplayMemberPath和组合框列的ValueMemberPath属性。

代码语言:javascript
运行
复制
 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;
    }

}
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45488470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档