Есть ли способ заполнить DataSource DataGridView, используя существующие столбцы?
Я пытаюсь установить DataSource в свой 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
Если вы не хотите, чтобы сетка генерировала столбцы, которые она находит в источнике данных и, кажется, отсутствует сама по себе, установите
datagridview.AutoGenerateColumns = false;
прежде чем установить DataSource
Когда DataSource DataGridView установлен или изменен, поведение по умолчанию заключается в создании столбцов с использованием имен столбцов в источнике данных, поскольку свойство AutoGenerateColumns по умолчанию равно true.
См. раздел "Примечания" в Документах об этом свойстве.
Если в конструкторе добавлены DataGridViewColumns, свойство DataPropertyName каждого столбца сравнивается с именем столбца в источнике данных.
Когда соответствие найдено, существующий DataGridViewColumns привязывается к соответствующему столбцу в источнике данных. В противном случае в сетку добавляется новый столбец.
Другими словами, как кажется, это то, что описывает OP, когда столбцы добавляются в конструкторе без DataPropertyName и устанавливается новый источник данных, столбцы в источнике данных добавляются к уже присутствующим в сетке.
Если DataPropertyName DataGridViewColumn не указан в конструкторе, вы можете установить его в коде перед назначением свойства 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;
Синтаксис в OP правильный.