2012-10-30 17 views
31

Sto cercando di popolare un DataGridView in base all'elemento selezionato in un ComboBox, ho questa parte funzionante.Come cancellare una vista della griglia di dati

Tuttavia, ho bisogno di essere in grado di cancellare la griglia prima di aggiungere i nuovi dati da un nuovo elemento piuttosto che aggiungere alla fine.

Come si cancella un DataGridView prima di aggiungere elementi ad esso?

+2

sono i dati legati al controllo? Codice per favore! – davenewza

+0

Possibile duplicato di [DataGridView.Clear()] (http://stackoverflow.com/questions/3744882/datagridview-clear) –

risposta

66

Innanzitutto, null sorgente dati:

this.dataGridView.DataSource = null; 

quindi deselezionare le righe:

this.dataGridView.Rows.Clear(); 

quindi impostare l'origine dati per la nuova lista:

this.dataGridView.DataSource = this.GetNewValues(); 
+5

Cosa succede se non annullo l'origine dati? – Patrick

5
DataGrid.DataSource = null; 
DataGrid.DataBind(); 
+1

Breve n semplice. Ha funzionato –

+0

Nel mio caso, Clear() non era disponibile per qualche motivo. Ho usato questo codice e ha funzionato perfettamente. –

6

È possibile cancellare DataGridView in questo modo

dataGridView1.Rows.Clear(); 
dataGridView1.Refresh(); 

Se è databound quindi provare questo

dataGridView1.Rows.Clear() // If dgv is bound to datatable 
dataGridView1.DataBind(); 
1
dataGridView1.Rows.Clear(); 
dataGridView1.Refresh(); 
2

È possibile assegnare l'origine dati come nulla della vostra griglia di dati e quindi rebind.

dg.DataSource = null; 
dg.DataBind(); 
+0

questo è DGV non datagrid. Errore facile - So di averlo fatto abbastanza volte. – bendecko

0

aggiornare la datagridview e aggiornare il datatable

dataGridView1.Refresh(); 
datatable.Clear(); 
0
datatable.Clear(); 
dataGridView1.DataSource = datatable; 
+3

Anche se la risposta fosse corretta, includerei sempre una piccola spiegazione perché l'utente potrebbe non capirlo semplicemente guardando il tuo codice. – nKn

-5

Solution è:

while (dataGridView1.RowCount > 1) 
{ 
    dataGridView1.Rows.RemoveAt(0); 
} 
+2

Una soluzione di looping non è appropriata ... –

1

Se si desidera cancellare tutte le intestazioni così come i dati, per esempio se si passa da 2 database completamente diversi con campi diversi, ho trovato colonne e intestazioni di colonne diverse il seguente a lavorare. Altrimenti, quando si cambia, le colonne/i campi di entrambi i database vengono visualizzati nella griglia.

dataTable.Dispose();//get rid of existing datatable 
dataTable = new DataTable();//create new datatable 

datagrid.DataSource = dataTable;//clears out the datagrid with empty datatable 
//datagrid.Refresh(); This does not seem to be neccesary 

dataadapter.Fill(dataTable); //assumming you set the adapter with new data    
datagrid.DataSource = dataTable; 
8

Se è destinato a un'origine dati -

dataGridView.DataSource=null; 
dataGridView.Rows.Clear(); 

lavorato per me.

+0

So che è tardi di circa 2 anni e mezzo, ma cosa succede se il datagridview NON è associato a un'origine dati? Come posso cancellarlo prima di aggiornare il datagrid? –

0
private void ClearGrid() 
{  
    if(this.InvokeRequired) this.Invoke(new Action(this.ClearGrid)); 

    this.dataGridView.DataSource = null; 
    this.dataGridView.Rows.Clear(); 
    this.dataGridView.Refresh(); 
} 
4

SE si desidera cancellare non solo dati, ma anche ComboBoxes, caselle di controllo, provare

dataGridView.Columns.Clear(); 
-1

La soluzione è:

dataGridView1.Rows.RemoveAt(0); 

Azzera la griglia e conserva le colonne.

+1

Rimuoverà solo 1 riga. per cancellare la griglia utilizzare il metodo 'dataGridView1.Rows.Clear();' – ClearLogic

2

Si potrebbe prendere questa prossima istruzione e farebbe il lavoro con la mancanza di perfomance.Se vuoi vedere l'effetto di ciò, metti una delle 2 istruzioni successive (Tecnicamente simili) in cui devi cancellare il DataGridView in un try {} catch (...) {} infine blocca e aspetta cosa succede.

 while (dataGridView1.Rows.Count > 1) 
    { 
     dataGridView1.Rows.RemoveAt(0); 
    } 

    foreach (object _Cols in dataGridView1.Columns) 
    { 
     dataGridView1.Columns.RemoveAt(0); 
    } 

Migliorate questo compito, ma la sua non è sufficiente, c'è un problema di ripristinare un DataGridView, a causa delle colonne che rimane nell'oggetto DataGridView. Infine, suggerisco, il modo migliore che ho implementato nella mia pratica di casa è di gestire questo gridView come un file con righe, colonne: una collezione di record basata sulla corrispondenza tra righe e colonne. Se puoi migliorare, prendi la tua scelta a) ob): foreach o while.

 //(a): With foreach 
    foreach (object _Cols in dataGridView1.Columns) 
    { 
     dataGridView1.Columns.RemoveAt(0); 
    } 

    foreach(object _row in dataGridView1.Rows){ 
     dataGridView1.Rows.RemoveAt(0); 
    } 

    //(b): With foreach 
    while (dataGridView1.Rows.Count > 1) 
    { 
     dataGridView1.Rows.RemoveAt(0); 
    } 
    while (dataGridView1.Columns.Count > 0) 
    { 
     dataGridView1.Columns.RemoveAt(0); 
    } 

Beh, come una raccomandazione Mai nella vostra vita eliminare le colonne prima, l'ordine è prima le righe dopo le cols, perché logicamente le colonne in cui creato per primo e poi il rows.It sarebbe un rigore in termini di corretta analisi

 foreach (object _Cols in dataGridView1.Columns) 
    { 
     dataGridView1.Columns.RemoveAt(0); 
    } 
    foreach (object _row in dataGridView1.Rows) 
    { 
     dataGridView1.Rows.RemoveAt(0); 
    } 
    while (dataGridView1.Rows.Count > 1) 
    { 
     dataGridView1.Rows.RemoveAt(0); 
    } 

    while (dataGridView1.Columns.Count > 0) 
    { 
     dataGridView1.Columns.RemoveAt(0); 
    } 

Quindi, inserirlo in una funzione o un metodo.

private void ClearDataGridViewLoopWhile() 
{   
    while (dataGridView1.Rows.Count > 1) 
    { 
     dataGridView1.Rows.RemoveAt(0); 
    } 

    while (dataGridView1.Columns.Count > 0) 
    { 
     dataGridView1.Columns.RemoveAt(0); 
    } 
} 

private void ClearDataGridViewForEach() 
{ 
    foreach (object _Cols in dataGridView1.Columns) 
    { 
     dataGridView1.Columns.RemoveAt(0); 
    } 
    foreach (object _row in dataGridView1.Rows) 
    { 
     dataGridView1.Rows.RemoveAt(0); 
    } 
} 

Infine, chiamare la nuova funzione ClearDataGridViewLoopWhile(); o ClearDataGridViewForEach(); dove è necessario utilizzarlo, ma è consigliato quando si eseguono query e si cambiano diverse tabelle che caricheranno con nomi di intestazione differenti nella grieView. Ma se vuoi preservare le intestazioni qui c'è una soluzione data.

-2

Questo è il lavoro per me

'int numRows = dgbDatos.Rows.Count; 

      for (int i = 0; i < numRows; i++) 
      { 
       try 
       { 

        int max = dgbDatos.Rows.Count - 1; 
        dgbDatos.Rows.Remove(dgbDatos.Rows[max]); 
        btnAgregar.Enabled = true; 
       } 
       catch (Exception exe) 
       { 
        MessageBox.Show("No se puede eliminar " + exe, "", 
        MessageBoxButtons.OK, MessageBoxIcon.Information); 
       } 
      }` 
+0

Perché eliminarne uno alla volta, quando è possibile utilizzare Clear() come suggerisce Trevor? Inoltre perché attivare un pulsante ogni volta che il ciclo viene eseguito? L'attivazione del pulsante avrebbe dovuto essere rimossa dall'esempio e, in primo luogo, avrebbe dovuto essere spostata all'esterno del ciclo. – nivs1978

-1
YourGrid.Items.Clear(); 
YourGrid.Items.Refresh(); 
0

Per avere un DataGrid è necessario disporre di un metodo che è la formattazione del DataGrid. Se vuoi cancellare il Datagrid, ti basta ricordare il metodo.

Ecco il mio metodo:

public string[] dgv_Headers = new string[] { "Id","Hotel", "Lunch", "Dinner", "Excursions", "Guide", "Bus" }; // This defined at Public partial class 


    private void SetDgvHeader() 
    { 
     dgv.Rows.Clear(); 
     dgv.ColumnCount = 7; 
     dgv.RowHeadersVisible = false; 
     int Nbr = int.Parse(daysBox.Text); // in my method it's the textbox where i keep the number of rows I have to use 
     dgv.Rows.Add(Nbr); 
     for(int i =0; i<Nbr;++i) 
      dgv.Rows[i].Height = 20; 
     for (int i = 0; i < dgv_Headers.Length; ++i) 
     { 
      if(i==0) 
       dgv.Columns[i].Visible = false; // I need an invisible cells if you don't need you can skip it 
      else 
       dgv.Columns[i].Width = 78; 
      dgv.Columns[i].HeaderText = dgv_Headers[i]; 
     } 
     dgv.Height = (Nbr* dgv.Rows[0].Height) + 35; 
     dgv.AllowUserToAddRows = false; 
    } 

DGV è il nome del DataGridView

Problemi correlati