Получение пустых строк после установки DataGridView.Источник

может кто-нибудь сказать мне, почему я получаю пустые строки после выполнения этого кода?

...
dataGridView.AutoGenerateColumns = false; //must be false, else getting additional columns from SQL
dataGridView.DataSource = dataSet.Tables[0].DefaultView; 

тоже пробовал

dataGridView.Update();

но не работает.

количество строк в порядке, но почему я получаю пустые строки?

Я использую Winforms.

12 ответов


что содержится в наборе данных?

возможно, DataTable, содержащийся в вашем наборе данных, не имеет строк. Я бы оставил AutoGenerateColumns в true и просто вручную скрыл, какие столбцы вы не хотите видеть. Я никогда не использовал AutoGenerateColumns = false. Однако без дополнительного кода его будет трудно диагностировать. Попробуйте поменять местами эти два оператора (.Сначала источник данных).

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-это текст заголовка, который будет отображаться.

EDIT:

из примера, который вы дали, похоже, что вы объединяете связанные столбцы с несвязанными столбцами.

этого:

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, убедитесь, что вы добавили некоторые связанные столбцы, или вы получите пустую строку для каждой записи


Я знаю, что прошло много времени с тех пор, как вы опубликовали это, но у меня была та же проблема и я понял ответ, поэтому я думал, что опубликую его, чтобы другие могли извлечь выгоду.

причина, по которой ваши столбцы были пустыми, заключается в том, что вам также нужно установить имя DataPropertyName каждого из столбцов в конструкторе, чтобы соответствовать именам полей базы данных. Просто установить имя дизайна недостаточно.

надеюсь, что это кому-то поможет.


Ok более расширенный образец:

я сделал в конструкторе несколько столбцов:

имена столбцов: customerID and customerFirstName

столбец headerText: Ident. and 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 Ident. | First name.

когда я поставил dataGridView.AutoGenerateColumns = true; затем я получаю такие столбцы dataGridView: Ident. | First name | customerID | customerFirstName.

все строки ниже Ident и First name are empty и все остальные ниже customerID и customerFirstName are ok.

теперь я хочу, чтобы строки ниже customerID и customerFirstName под Ident и First name и колонки 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;


меня.dgvList.AutoGenerateColumns = False

    Dim col = New DataGridViewTextBoxColumn()
    col.DataPropertyName = "VisitNo"
    col.HeaderText = "Sr. No."
    dgvList.Columns.Add(col)

Он работает


попробуйте добавить этот код перед загрузкой сетки

dataGridView.ColumnCount = 0;

поэтому у меня была пользовательская реализация, где я даю пользователям возможность сохранять excel-подобные фильтры столбцов.

Я загрузил результаты в сетку, но ничего не появилось, так как excel-подобный фильтр в столбце не мог ничего сопоставить.


Я знаю, что уже поздно, но для моего решения не было настройки столбцов datagridview. Просто добавьте пустой datagridview и свяжите его.


в случае, если у кого-то все еще есть проблема, моя проблема заключалась в том, что я пытался привязаться к открытым полям класса, а не к свойствам. изменение свойств, т. е. {get; set;} исправлено.


в моем случае строки не были видны, потому что я сгенерировал данные LINQ и забыл добавить вызов .ToArray() в конце. После преобразования строк данных в массив это сработало.