2

我只是不能让它工作。我在 winforms 中有一个 datagridview,在我的这一列中是一个 DataGridViewComboBoxColumn。

在我的构造函数中,我像这样设置它

DataGridViewComboBoxColumn column = (DataGridViewComboBoxColumn)RectangleGrid.Columns["Material"];

        DataTable data = new DataTable();

        data.Columns.Add(new DataColumn("Value", typeof(int)));
        data.Columns.Add(new DataColumn("Description", typeof(string)));

        foreach (Materials M in DataStructure.Active.Active_Materials)
        {
            data.Rows.Add(M.MaterialNr, (M.MaterialNr + 1).ToString() + " " + M.Material.Name);
        }

        column.DataSource = data;
        column.ValueMember = "Value";
        column.DisplayMember = "Description";

它实际上运行良好,只是在我想要的下拉框中没有选择任何内容。我已经用谷歌搜索了这个,例如尝试了这种方法: http: //goo.gl/kBy8W但没有成功,因为 EditingControlShowing 仅在我单击该框时发生,而不是在它第一次出现时发生(因此我可以设置选定的索引一旦它被点击但那不好)。CellFormatting 版本至少会更改值,但它只是将一个字符串放在那里,而不是我的数据源中的第一个索引。

我也试过这个

column.DefaultCellStyle.NullValue = data.Rows[0]["Description"];
column.DefaultCellStyle.DataSourceNullValue = data.Rows[0]["Value"];

这似乎有效,但是当我在下拉列表中选择第一个索引时(所以下拉下拉列表,然后选择第一个索引,然后取消选择单元格)我从 ParseFormattedValue 收到一个错误,它说它不能将“值”转换为系统.字符串。

这似乎是在正确的轨道上,但我无法让它工作:http: //goo.gl/VevA3

4

1 回答 1

0

我最终以一个我不喜欢的非常肮脏的解决方案“解决”它,但它有点工作。

我将 datagridview 绑定到数据表(不是数据库),所以我所做的就是将事件处理程序连接到数据表中的 TableNewRow 事件。

然后我在那个事件处理程序中做了这个

    private void NewRectangleInserted(Object sender, DataTableNewRowEventArgs e)
    {
        if (e.Row[0].ToString() == "")
        {
            e.Row[0] = 0;
        }
    }

所以基本上当创建一个新行时,我将组合框的值设置为 0,除非用户通过在该特定单元格中添加一个值来创建该行(为什么我检查它是否等于“”)

结果是,只要您突出显示新行或行中的任何单元格,组合框就会被填充。但是,底部的新行仍然有一个空白组合框,直到您突出显示它。

不完美但好多了。糟糕的是,它必须通过黑客来完成!

于 2012-12-14T00:43:09.403 回答