Получение пустых строк после установки DataGridView.DataSource - PullRequest
7 голосов
/ 17 ноября 2009

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

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

Также пробовал

dataGridView.Update();

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

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

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

Ответы [ 12 ]

16 голосов
/ 18 ноября 2009

Я нашел проблему.

Я спроектировал столбцы в конструкторе VS datagridview. Не имя столбца, а столбец DataPropertyName должен совпадать с полями в базе данных.

Тогда дублирующиеся столбцы также будут скрыты.

9 голосов
/ 17 ноября 2009

Попробуйте что-нибудь вроде этого:

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;

НТН.

4 голосов
/ 07 июля 2012

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

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

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

4 голосов
/ 17 ноября 2009

Кроме того, если вы используете AutoGenerateColumns = false, убедитесь, что вы добавили несколько связанных столбцов, или вы получите пустую строку для каждой записи

3 голосов
/ 17 ноября 2009

Что содержится в вашем DataSet?

Возможно, в DataTable, содержащемся в вашем наборе данных, нет строк. Я бы оставил 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
1 голос
/ 12 июля 2018

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

1 голос
/ 11 мая 2014

Me.dgvList.AutoGenerateColumns = False

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

Работает

1 голос
/ 17 ноября 2009

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

Я сделал в конструкторе несколько колонок:

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

заголовок столбцаТекст: 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 равны empty, а все остальные ниже customerID и customerFirstName равны 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;

0 голосов
/ 27 августа 2018

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

0 голосов
/ 03 апреля 2018

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

...