使用现有列填充 DataGridView 的数据源

Fill the DataSource of a DataGridView with existing Columns

有没有办法使用现有的列来填充 DataGridView 的数据源?

我正在尝试为我的 DataGridView 设置一个数据源;每次我设置数据源时,它都会创建新的列,这不是预期的结果。
我希望数据显示在现有的列中。

这是我的代码:

DataTable dt = new DataTable();
dt.Columns.Add("SourcePath", typeof(string));
dt.Columns.Add("SourceFile", typeof(string));
dt.Columns.Add("OutputPath", typeof(string));
dt.Columns.Add("OutputFile", typeof(string));
dt.Columns.Add("Status", typeof(string));
dt.Columns.Add("Message", typeof(string));

dt.Rows.Add(new object[] { "Test", "Test", "Test", "Test", "Test", "Belgium" });
dt.Rows.Add(new object[] { "Test", "Test", "Test", "Test", "Test", "France" });
dt.Rows.Add(new object[] { "Test", "Test", "Test", "Test", "Test", "Germany" });
dt.Rows.Add(new object[] { "Test", "Test", "Test", "Test", "Test", "Spain" });
dt.Rows.Add(new object[] { "Test", "Test", "Test", "Test", "Test", "Switzerland" });
dt.Rows.Add(new object[] { "Test", "Test", "Test", "Test", "Test", "United Kingdom" });

datagridview.DataSource = dt;

我是不是做错了什么?

可能是语法引起的。

    DataTable dt = new DataTable();
    dt.Columns.Add("SourcePath", typeof(string));
    dt.Columns.Add("SourceFile", typeof(string));
    dt.Columns.Add("OutputPath", typeof(string));
    dt.Columns.Add("OutputFile", typeof(string));
    dt.Columns.Add("Status", typeof(string));
    dt.Columns.Add("Message", typeof(string));


  
    var Row = dt.NewRow(); //Create a new row
    Row["SourcePath"] = "Test";//Add Column value via Indexer
    //Add Rest of Column Values

    dt.Rows.Add(Row); //Append to Table Rows

如果您不希望网格生成它在 DataSource 中找到的列并且它本身似乎丢失了列,请设置

datagridview.AutoGenerateColumns = false;

设置数据源之前

当设置或更改 DataGridView 的数据源时,默认行为是使用数据源中列的名称生成列,因为 AutoGenerateColumns 属性 默认为 true.
请参阅文档中关于此的备注部分 属性。

如果在设计器中添加了 DataGridViewColumns,每个 Column 的 DataPropertyName 属性 将与数据源中 Columns 的名称进行比较。
找到匹配项后,现有的 DataGridViewColumns 将绑定到数据源中的匹配列。否则,将向网格添加一个新列。
换句话说 - 正如 OP 所描述的那样 - 当在没有 DataPropertyName 的情况下在设计器中添加列并设置新的数据源时,数据源中的列将添加到网格中已经存在的列中。

如果在Designer中没有指定DataGridViewColumn的DataPropertyName,您可以在分配DataSource 属性之前在代码中设置它。例如:

var dt = new DataTable();
dt.Columns.Add(new DataColumn("SourcePath", typeof(string)) { Caption = "Source Path"});  
// [...]

dt.Rows.Add(new[] { "Test", "Test", "Test", "Test", "Test", "Belgium" });
// [...]

// Assuming DGV Columns are added in the Designer without a DataPropertyName set
datagridview.Columns[0].DataPropertyName = dt.Columns[0].ColumnName
datagridview.Columns[0].HeaderText = dt.Columns[0].Caption

// Or in different ways, e.g.: 
datagridview.Columns["SourcePath"].DataPropertyName = dt.Columns[0].ColumnName
datagridview.Columns["SourcePath"].HeaderText = dt.Columns[0].Caption
// [...]

datagridview.DataSource = dt;