C#使用数据表在绑定数据网格上的DataGridComboBoxColumn上设置值

时间:2012-09-09 13:46:06

标签: c# datagridviewcombobox

使用C#

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

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

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

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

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

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

Datagrid定义:

        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中填充的值,但这似乎不起作用。

由于我无法弄清楚如何使数据绑定工作,我决定尝试将单元格强制为我想要的值,所以我在dataload上尝试了这个。

        ... 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++;
        }

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

我对此代码没有任何错误或警告。

我更愿意让数据绑定控制并在没有我专门设置值的单元格的情况下完成它。但如果这就是我需要做的事情,那就这样吧......

1 个答案:

答案 0 :(得分:0)

嗯,你的代码(据我所见)似乎很好。 我不知道你的“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;
    }
}

此代码有效,并尝试执行相同的操作,您只需从dataBase填充dataTable。但如果你想要,你只能尝试我的这个确切的代码,你会看到它的工作!

再见