将下拉列表添加到 DataGrid 列并在运行时填充行 C#

Add dropdown list to DataGrid columns and populate rows at runtime C#

我的最终目标是使用在运行时从数据库检索的数据填充 DataGrid。我的方法是先从该数据库中提取所有列,然后为每一行的每一列提取相应的数据,如下所示:

    ReadOnlyCollection<Field> tablefields = {//has the fields populated from the database};
//adding all the columns to the data table    
         var datatable = new DataTable("mytable");
                            foreach (var field in tablefields)
                            { datatable.Columns.Add(field.Name, wFieldType); }
    
//Then add the rows
     while (cursor.MoveNext())
                                {
                                    var tableRow = datatable.NewRow();
    
                                    var row = cursor.Current;
                                    for(var i = 0; i < tablefields.Count; i++)//add the values for each field to the data table.
                                    {
                                        tableRow[i] = row[i] ?? DBNull.Value;
                                    }
                                    datatable.Rows.Add(tableRow);                                  
    
                                }     

             

但是我的问题是,我拉取的某些列必须采用 DataGridComboBoxColumn 的形式,因为它们在数据库的下拉列表中具有预设值。最好的情况是,当我将列一一拉入我的数据表时,我会检测那些具有预设值的列,并在将它们添加到数据表之前将它们设为 DataGridComboBoxColumn 类型。我显然不能那样做,因为你不能在数据表上有一个组合框。我的下一个选择是使用 dataGrid 在运行时从数据库加载列和数据。 我可以使用组合框添加列,如下面的代码所示,但我无法弄清楚如何将我的数据从数据库中获取到包含预加载列的数据网格中。

DataGridComboBoxColumn cb = new DataGridComboBoxColumn();
cb.ItemsSource = new List(){to be populated later}
cb.Header = field.Name;                  
MyDataGrid.Columns.Add(cb);

上面的代码用作测试 DataGridComboBoxColumn 的示例,果然我能够看到带有组合框的数据网格。我只是不知道如何将我的数据库数据放入 table。我将不胜感激任何想法。 PS:我无法使用 datagridview,因为我正在使用 api,所以我只能使用 datagrid。

您应该将 SelectedItemBinding 设置为绑定到 DataTable 中的列,该列包含要选择的 ItemsSource 中的值:

cb.SelectedItemBinding = new Binding("AColumnInYourDataTable");

如果将 ItemsSource 设置为 List<T>,其中 T 是复杂类型,则应改为设置 SelectedValueBindingSelectedValuePath 以及 DisplayMemberPath 属性:

cb.SelectedValueBinding = new Binding("AColumnInYourDataTable");
cb.SelectedValuePath = "NameOfThePropertyOfTThatHoldsTheValue";
cb.DisplayMemberPath = "NameOfAPropertyOfTThatHoldsTheDisplayName";