Я сказал бы, что один из самых больших камней преткновения будет мучиться над моделью данных / рабочий процесс. Я предсказываю, что это возьмет длинный время и включит много аргументов о том, что должно произойти с ошибкой при определенных обстоятельствах, что действительно составляет ошибку, и т.д. А не проведите месяцы, споря туда и сюда, если необходимо было просто развернуть предварительно созданную систему, большинство людей изучит, как использовать его и сделать лучшее из него, неважно, какие решения уже фиксируются. Выберите что-то открытый исходный код, и можно всегда настраивать его позже в случае необходимости - который будет очень более быстр, чем прокрутка собственного с нуля.
Что содержится в вашем DataSet?
Возможно, в DataTable, содержащемся в вашем DataSet, нет строк. Я бы оставил AutoGenerateColumns равным true и просто вручную скрыл, какие столбцы вы не хотите видеть. Я никогда не использовал AutoGenerateColumns = false. Однако без дополнительного кода его будет сложно диагностировать. Попробуйте поменять местами эти два оператора (сначала .DataSource).
AutoGenerateColumns может не влиять на соответствующий источник привязки (DataTable из DataSet).
DataSet должен быть заполнен DataAdapter:
// Example
DataAdapter = new SqlDataAdapter();
DataAdapter = CreateInventoryAdapter();
DataAdapter.TableMappings.Add("Table", "GARAGE");
DataAdapter.Fill(myDataSet);
myDataView = myDataSet.Tables[0].DefaultView;
dataGridView1.DataSource = myDataView
Я нашел проблему.
Я разработал столбцы в конструкторе VS datagridview. Не имя столбца, а имя столбца DataPropertyName должно совпадать с полями в базе данных.
Тогда также будут скрыты повторяющиеся столбцы.
Попробуйте что-нибудь в этом роде:
grid.AutoGenerateColumns = false;
DataGridViewColumn col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "Prop1";
col.HeaderText = "Property 1";
grid.Columns.Add(col);
col = new DataGridViewTextBoxColumn();
col.DataPropertyName = "Prop2";
col.HeaderText = "Property 2";
grid.Columns.Add(col);
grid.DataSource = dataSet.Tables[0].DefaultView;
Prop1 и Prop2 должны соответствовать именам столбцов вашей таблицы. Свойство 1 и свойство 2 - это отображаемый текст заголовка.
РЕДАКТИРОВАТЬ:
Из приведенного вами примера похоже, что вы комбинируете связанные столбцы с несвязанными столбцами.
Сделайте следующее:
1. Удалите все столбцы, добавленные с помощью конструктора 2. Добавьте этот код:
grid.AutoGenerateColumns = false;
DataGridViewColumn colID = new DataGridViewTextBoxColumn();
colID.DataPropertyName = "customerID";
colID.HeaderText = "Ident.";
grid.Columns.Add(colID);
DataGridViewColumn colName = new DataGridViewTextBoxColumn();
colName.DataPropertyName = "customerFirstName";
colName.HeaderText = "First name";
grid.Columns.Add(colName);
grid.DataSource = dataSet.Tables[0].DefaultView;
HTH.
Кроме того, если вы используете AutoGenerateColumns = false, убедитесь, что вы добавили несколько связанных столбцов, иначе вы получите пустую строку для каждой записи
Хорошо, более расширенный пример:
Я сделал в дизайнере несколько столбцов:
имена столбцов: customerID и customerFirstName
заголовок столбца Текст: Идент. и First name
, затем я получаю данные из таблицы sql ...
sql = "select customerID, customerFirstName From customer;";
dataGridView.AutoGenerateColumns = false;
dataGridView.DataSource = dataSet.Tables[0].DefaultView;
и столбцы таблицы sql такие же, как имена столбцов в dataGridView.
Результат, который я получаю, когда dataGridView.AutoGenerateColumns = false ;
- это dataGridView с двумя столбцами с идентификатором headerText . | Имя
.
Когда я устанавливаю dataGridView.AutoGenerateColumns = true;
, я получаю такие столбцы dataGridView: и First name
, затем я получаю данные из таблицы sql ...
sql = "select customerID, customerFirstName From customer;";
dataGridView.AutoGenerateColumns = false;
dataGridView.DataSource = dataSet.Tables[0].DefaultView;
и столбцы таблицы sql такие же, как имена столбцов в dataGridView.
Результат, который я получаю, когда dataGridView.AutoGenerateColumns = false ;
представляет собой dataGridView с двумя столбцами с идентификатором headerText . | Имя
.
Когда я устанавливаю dataGridView.AutoGenerateColumns = true;
, я получаю такие столбцы dataGridView: и First name
, затем я получаю данные из таблицы sql ...
sql = "select customerID, customerFirstName From customer;";
dataGridView.AutoGenerateColumns = false;
dataGridView.DataSource = dataSet.Tables[0].DefaultView;
и столбцы таблицы sql такие же, как имена столбцов в dataGridView.
Результат, который я получаю, когда dataGridView.AutoGenerateColumns = false ;
- это dataGridView с двумя столбцами с идентификатором headerText . | Имя
.
Когда я устанавливаю dataGridView.AutoGenerateColumns = true;
, я получаю такие столбцы dataGridView:
Идент. | Имя | customerID | customerFirstName
.
все строки ниже Ident
и First name
пустые
, а все остальные строки ниже customerID
и customerFirstName
are ok
.
Теперь я хочу, чтобы строки ниже customerID
и customerFirstName
находились в Ident
и Имя
и столбцы customerID
и customerFirstName
должны быть скрыты.
Я написал этот код, и он работает:
DataTable dTable = dataGridView.GetTable().Tables[0];
foreach (DataRow dataRow in dataGridView.GetTable().Tables[0].Rows)
{
int n = dataGridView.Rows.Add();
foreach (DataColumn dataColumn in dTable.Columns)
{
dataGridView.Rows[n].Cells[dataColumn.ColumnName].Value = dataRow[dataColumn.ColumnName].ToString();
}
}
Но почему DataGridView не делает этого для меня с помощью этого кода:
dataGridView.DataSource = dataSet.Tables [0] .DefaultView;