【问题标题】:C# Setting value on DataGridComboBoxColumn on bound datagrid using datatablesC# 使用数据表在绑定数据网格上的 DataGridComboBoxColumn 上设置值
【发布时间】:2012-09-09 13:46:06
【问题描述】:

使用 C#

我使用 SQL 使用查询结果填充数据表。

然后我创建了一个使用该数据表作为其源的数据网格。

数据网格已经配置了 DataGridViewComboBoxColumn 类型的列。

组合框的数据源是另一个加载 SQL 的数据表,每行有两个字符串。第一个字符串是我需要的实际值,第二个字符串是用户可见字符串。

使用第二个数据表中的信息正确填充组合框,并且值按需要工作。当我从数据表中保存数据时,我得到了组合框的正确信息。

当我尝试将保存的 SQL 信息加载回该数据网格时,问题就出现了。该值似乎没有绑定到数据表项。

数据网格定义:

        dgHeaders.DataSource = dtCSVHeaders;

        dgHeaders.Columns["nIndex"].Visible = false;

        if (!dgHeaders.Columns.Contains("colType"))
        {
            DataGridViewComboBoxColumn colType = new DataGridViewComboBoxColumn();
            colType.HeaderText = "DB Field";
            colType.DropDownWidth = 140;
            colType.Width = 140;
            colType.DataSource = dtFields;
            colType.DataPropertyName = "szDBField";
            colType.DisplayMember = "szVisualField";
            colType.ValueMember = "szDBField";
            colType.Name = "DB Field";
            colType.DefaultCellStyle.NullValue = "--Select--";
            dgHeaders.Columns.Add(colType);

        }

首先,我尝试将列名 colType 设置为我在 dataRow 中填充的值,但这似乎不起作用。

由于我不知道如何让数据绑定工作,我决定尝试将单元格强制为我想要的值,所以我在数据加载上尝试了这个。

        ... SQL load

        foreach (DataRow drRow in dtLoad.Rows)
        {
            string szColumnName = drRow["szOrgColumnName"].ToString();
            string szMatchName = drRow["szMatchColumn"].ToString();
            DataRow drAdd = dtCSVHeaders.NewRow();
            drAdd["nIndex"] = nLoop;
            drAdd["szHeader"] = szColumnName;
            dtCSVHeaders.Rows.Add(drAdd);
            dgHeaders.Rows[nLoop].Cells[2].Value = szMatchName;
            nLoop++;
        }

但遗憾的是,这仍然没有设置组合框的值。

此代码没有错误或警告。

我宁愿让数据绑定来控制并做它的事情,而无需我专门为单元格设置值。但如果这是我需要做的,那就这样吧......

【问题讨论】:

    标签: c# datagridviewcombobox


    【解决方案1】:

    嗯,您的代码(据我所知)看起来不错。 我不知道你的“dtFields”对象到底是什么,但它应该是dataTable。 我做了一个简单的例子来说明应该如何做。 看看吧:

    public partial class Form1 : Form
    {        
        public Form1()
        {
            InitializeComponent();
            dataGridView1.Columns.Add("column1", "Column name");
            dataGridView1.Columns.Add(CreateComboBox());
            //adding some rows:
            dataGridView1.Rows.Add("a");
            dataGridView1.Rows.Add("b");
        }
    
        private DataGridViewComboBoxColumn CreateComboBox()
        {
            DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
            {
                combo.Name = "comboColumn";
                combo.HeaderText = "Selection";
                combo.DataSource = GetDataForComboBox();
                combo.DisplayMember = "Name";
                combo.ValueMember = "Id";
            }
            return combo;
        }
    
        private DataTable GetDataForComboBox()
        {
            //this is your method to get the data from database
    
            //in my exmaple I will simply add some example data:
            DataTable table = new DataTable("ExampleData");
            table.Columns.Add("Id", typeof(int));
            table.Columns.Add("Name", typeof(string));
            table.Rows.Add(1, "Name 1");
            table.Rows.Add(2, "Name 2");
            table.Rows.Add(3, "Name 3");
            return table;
        }
    }
    

    这段代码有效,并尝试做同样的事情,你只从数据库中填充数据表。但是如果你愿意,你只能试试我的这个确切的代码,你会看到它的工作原理!

    再见

    【讨论】:

    • 我玩这个已经有一段时间了。我可以很好地填充组合框,它是从我遇到问题的外部数据源设置值...所有组合框都有相同的数据,但我想显示这些框的值。
    猜你喜欢
    • 1970-01-01
    • 2011-10-26
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 2013-01-14
    • 1970-01-01
    相关资源
    最近更新 更多