Svuotare DataGridView dopo l'aggiunta di valori da DataTable con il grande numero di colonne
-
27-10-2019 - |
Domanda
Il mio DataTable ha oltre 1000 colonne e voglio visualizzare i valori sul datagridview. A causa del problema FillWeigth Io uso il seguente metodo per riempire il GridView,
public bool TransferDataTableToGrid(DataGridView dataGrid, DataTable dataTable)
{
dataGrid.SuspendLayout();
if ((dataGrid != null) && (dataTable != null))
{
dataGrid.Columns.Clear();
dataGrid.AutoGenerateColumns = false;
dataGrid.DataSource = dataTable;
for (int i = 0; i < dataTable.Columns.Count; i++)
{
DataGridViewColumn column = new DataGridViewColumn();
column.Name = dataTable.Columns[i].ColumnName;
column.FillWeight = 1;
column.CellTemplate = new DataGridViewTextBoxCell();
column.ValueType = dataTable.Columns[i].DataType;
dataGrid.Columns.Add(column);
}
for (int i = 0; i < dataTable.Columns.Count; i++)
{
for (int ii = 0; ii < dataTable.Rows.Count; ii++)
{
dataGrid[i, ii].Value = dataTable.Rows[ii][i];
}
}
}
dataGrid.ResumeLayout();
return true;
}
e qualche volta mi hanno un effetto che il mio GridView è vuota. Solo dopo secondi dati di esecuzione viene visualizzata. Avete delle idee, perché ...?
Grazie.
Soluzione 3
Bene, ho risolto il mio problema. Con il suggerimento di Ivan ho provato il modo alternativo per i dati di riempimento: invece di utilizzare DataSource aggiungo nuove righe manualmente
foreach (DataRow row in dataTable.Rows)
{
var dataGridRow = new DataGridViewRow();
dataGridRow.CreateCells(dataGrid);
for (int i = 0; i < row.ItemArray.Length; i++)
{
dataGridRow.Cells[i].Value = row.ItemArray[i];
}
dataGrid.Rows.Add(dataGridRow);
}
... e funziona - vengono visualizzati i dati in DGV. Grazie!
Altri suggerimenti
Vi consiglio di usare il paging, voglio dire che si può mostrare circa 20 colonne con pulsanti di navigazione sotto la griglia, è come Google o altri ... anche il tuo non sono programmazione di un'applicazione web.
Usa vincolante fonte per riempire la griglia
SqlDataAdapter adapter = new SqlDataAdapter(database.cmd);
dataSet1.Tables.Clear();
adapter.Fill(dataSet1, "Table");
bs = new BindingSource();
bs.DataSource = dataSet1.Tables["Table"];
dataGridView1.DataSource = bs;
Ora non avete bisogno di preoccuparsi per la creazione di colonne e le cellule di riempimento in loop e la sua molto migliore performance