使用现有列填充 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;
有没有办法使用现有的列来填充 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;