2009-11-17 20 views
7

Qualcuno potrebbe dirmi perché sto ricevendo righe vuote dopo aver eseguito questo codice?Ottenere righe vuote dopo aver impostato DataGridView.DataSource

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

provato anche

dataGridView.Update(); 

ma non funziona.

Il conteggio delle righe è ok, ma perché ottengo righe vuote?

Sto utilizzando Winforms.

risposta

3

Ciò che è contenuto nel DataSet?

Forse il DataTable contenuto nel DataSet non ha righe. Lasciare AutoGenerateColumns su true e nascondere manualmente quali colonne non si desidera vedere. Non ho mai usato AutoGenerateColumns = false. Tuttavia, senza più codice, sarà difficile da diagnosticare. Prova a scambiare queste due istruzioni (.DataSource prima).

Le colonne AutoGenerate possono non avere alcun effetto sull'origine di associazione corrispondente (DataTable da DataSet).

DataSet ha bisogno di essere riempito da DataAdapter:

// Example 
DataAdapter = new SqlDataAdapter(); 
DataAdapter = CreateInventoryAdapter(); 
DataAdapter.TableMappings.Add("Table", "GARAGE"); 

DataAdapter.Fill(myDataSet); 
myDataView = myDataSet.Tables[0].DefaultView; 
dataGridView1.DataSource = myDataView 
+0

Ragazzi, grazie per il vostro aiuto, ma non voglio dedicare altro tempo a questo. Anche il mio codice esteso funziona bene, quindi non voglio più cambiarlo. Cordiali saluti – Jooj

4

Inoltre, se si utilizza AutoGenerateColumns = false, assicurarsi di aver aggiunto alcune colonne associate, o si otterrà una riga vuota per ogni record

+0

Avete un breve esempio di come aggiungere colonne vincolate? – Jooj

+0

Vedi il post di Sorin Comanescu in basso. Questo è il modo di farlo. – tardomatic

9

Prova qualcosa in queste righe:

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 deve corrispondere ai nomi delle colonne della tabella. Proprietà 1 & La proprietà 2 è il testo dell'intestazione da visualizzare.

EDIT:

Dall'esempio hai dato sembra che stai combinando colonne associate con colonne non associate.

Fate questo:

1.Rimuovere le colonne aggiunto utilizzando il progettista 2.Add questo codice:

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.

+0

Il mio codice fa lo stesso del tuo. Solo che ho impostato le colonne di datagridview nel designer e corrispondono ai nomi delle colonne delle mie tabelle. – Jooj

+0

Quindi, se si sta vincolando la griglia utilizzando il designer e ottenere colonne aggiuntive da sql è l'unica preoccupazione, è possibile semplicemente rendere invisibili le colonne indesiderate utilizzando il designer. –

+0

Potrei renderli invisibili ma i testi delle intestazioni delle colonne aggiuntive sono diversi dalle altre colonne create con il designer. p.s .: Questo è per un'applicazione multilingua. – Jooj

1

Ok un campione più esteso:

ho fatto nella finestra di progettazione alcune colonne:

nomi delle colonne: customerID and customerFirstName

colonna HeaderText: Ident. and First name

tanto sono alcuni dati da tabella SQL ...

sql = "select customerID, customerFirstName From customer;"; 

dataGridView.AutoGenerateColumns = false; 
dataGridView.DataSource = dataSet.Tables[0].DefaultView; 

e le colonne della tabella sql sono uguali ai nomi delle colonne in dataGridView.

Il risultato che ottengo quando dataGridView.AutoGenerateColumns = false; è un dataGridView a due colonne con header Ident. | First name.

Quando si imposta dataGridView.AutoGenerateColumns = true;, quindi ottengo colonne DataGridView come questa: Ident. | First name | customerID | customerFirstName.

tutte le righe sotto Ident e First name sono empty e tutti gli altri sotto customerID e customerFirstName sono ok.

Ora voglio che le righe qui sotto customerID e customerFirstName sarebbero sotto Ident e First name e colonne customerID e customerFirstName devono essere nascosti.

ho scritto questo codice e funziona:

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(); 
    } 
} 

Ma perché DataGridView dosen't fare questo per me con questo codice:

dataGridView.DataSource = dataSet.Tables[0].DefaultView;

+0

Hai riempito il tuo DataSet? DataAdapter = new SqlDataAdapter(); DataAdapter = CreateInventoryAdapter(); DataAdapter.TableMappings.Add ("Tabella", "GARAGE"); DataAdapter.Fill (myDataSet); myDataView = myDataSet.Tables [0] .DefaultView; dataGridView1.DataSource = myDataView –

14

ho trovato il problema.

Ho progettato le colonne nel progettista VS DataGridView. Non il nome della colonna, ma la colonna DataPropertyName deve corrispondere ai campi nel database.

Quindi anche le colonne duplicate si nasconderanno.

4

So che è passato molto tempo da quando hai pubblicato questo, ma ho appena avuto lo stesso problema e ho capito la risposta, quindi ho pensato di postarlo in modo che altri potessero trarne beneficio.

Il motivo per cui le colonne sono vuote è perché è necessario impostare anche DataPropertyName di ciascuna colonna nella finestra di progettazione in modo che corrisponda ai nomi dei campi del database. Basta impostare il nome del design non è abbastanza.

La speranza che aiuta qualcuno.

1

Me.dgvList.AutoGenerateColumns = False

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

Funziona

0

Prova ad aggiungere il codice prima di caricare la griglia

dataGridView.ColumnCount = 0; 
0

così ho avuto un'implementazione personalizzata in cui io do gli utenti la possibilità di salvare i filtri tipo Excel delle colonne.

Ho caricato i risultati nella griglia, ma non è apparso nulla dal momento che il filtro di tipo excel su una colonna non poteva corrispondere a nulla.

Problemi correlati