2012-10-30 21 views
31

Ich versuche, ein DataGridView basierend auf dem ausgewählten Element in einer ComboBox zu füllen, ich habe dieses Teil funktioniert.So löschen Sie eine Datenrasteransicht

Allerdings muss ich in der Lage sein, das Raster zu löschen, bevor ich die neuen Daten von einem neuen Element hinzufüge, anstatt es nur am Ende hinzuzufügen.

Wie lösche ich ein DataGridView vor dem Hinzufügen von Elementen?

+2

werden die Daten an das Steuerelement gebunden? Code bitte! – davenewza

+0

Mögliches Duplikat von [DataGridView.Clear()] (http://stackoverflow.com/questions/3744882/datagridview-clear) –

Antwort

66

Zum einen null die Datenquelle:

anschließend die Zeilen löschen:

this.dataGridView.Rows.Clear(); 

Dann stellen Sie die Datenquelle auf die neue Liste:

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

Was passiert, wenn ich die Datenquelle nicht null mache? – Patrick

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

Kurz n einfach. Arbeitete –

+0

In meinem Fall war Clear() aus irgendeinem Grund nicht für mich verfügbar. Ich habe diesen Code benutzt und es hat perfekt funktioniert. –

6

Sie DataGridView auf diese Weise löschen können

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

Wenn es databound dann versuchen, diese

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

Sie können die Datenquelle als null Ihrer Datenraster zuweisen und es dann erneut binden.

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

das ist DGV nicht DataGrid. Einfacher Fehler - ich weiß, dass ich es oft genug gemacht habe. – bendecko

0

aktualisieren Sie die Datagridview und aktualisieren Sie die Datentabelle

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

Auch wenn die Antwort richtig war, würde ich immer eine kleine Erklärung hinzufügen, weil der Benutzer es vielleicht nicht versteht, einfach Ihren Code zu schauen. – nKn

-5

Lösung ist:

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

Eine Looping-Lösung ist nicht geeignet ... –

1

Wenn Sie alle Header sowie die Daten löschen möchten, zum Beispiel Wenn Sie zwischen zwei völlig unterschiedlichen Datenbanken mit verschiedenen Feldern, also verschiedenen Spalten und Spaltenüberschriften, wechseln, habe ich gefunden Folgendes zur Arbeit. Andernfalls werden beim Wechsel die Spalten/Felder aus beiden Datenbanken im Raster angezeigt.

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

Wenn es zu einer Datenquelle gebunden wird -

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

für mich gearbeitet.

+0

Ich weiß, das ist spät um etwa 2 und ein halbes Jahr, aber was, wenn die Datagridview nicht an eine Datenquelle gebunden ist? Wie lösche ich es, bevor ich das Datagrid aktualisiere? –

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

Wenn Sie nicht nur Daten löschen wollen, sondern auch Comboboxen, Checkboxen, versuchen

dataGridView.Columns.Clear(); 
-1

Die Lösung lautet:

dataGridView1.Rows.RemoveAt(0); 

das Gitter Löscht und die Spalten bewahrt.

+1

Es wird nur 1 Zeile entfernt. Löschen der Grid-Methode 'dataGridView1.Rows.Clear();' – ClearLogic

2

Sie könnten diese nächste Anweisung nehmen und würde die Arbeit mit mangelnder Leistung tun.Wenn Sie den Effekt sehen wollen, setzen Sie eine der beiden nächsten Anweisungen (Technisch ähnlich), wo Sie das DataGridView in ein try {} catch (...) {} endgültig blockieren müssen und warten was passiert.

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

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

Sie diese Aufgabe verbessern, aber es ist nicht genug, gibt es ein Problem, ein Datagridview zurückgesetzt, weil der colums, die im Datagridview-Objekt bleibt. Schließlich schlage ich vor, dass der beste Weg, den ich in meiner häuslichen Praxis implementiert habe, darin besteht, diese GridView als eine Datei mit Zeilen, Spalten zu behandeln: eine Datensatzsammlung basierend auf der Übereinstimmung zwischen Zeilen und Spalten. Wenn du dich verbessern kannst, dann nimm deine eigene Wahl a) oder b): foreach oder 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); 
    } 

Nun, als recomendation zuerst die Spalten nie in Ihrem Leben löschen, ist die Reihenfolge, bevor die Zeilen nach den Spalten, weil logisch die Spalten, in denen zuerst erstellt und dann würde die rows.It eine Strafe in Bezug auf seinen von korrekten analisys.

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

Dann setzen Sie es in eine Funktion oder Methode.

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

Schließlich, rufen Sie Ihre neue Funktion ClearDataGridViewLoopWhile(); oder ClearDataGridViewForEach(); wo Sie es verwenden müssen, aber es wird empfohlen, wenn Sie Abfragen machen und mehrere Tabellen wechseln, die mit verschiedenen Header-Namen in der grieView geladen werden. Aber wenn Sie hier Header behalten wollen, gibt es eine Lösung.

-2

Dies wird mir arbeiten

'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

Warum löschen Sie jeweils einzeln, wenn Sie Clear() verwenden können, wie Trevor vorschlägt? Warum auch eine Taste jedes Mal aktivieren, wenn die Schleife läuft? Die Schaltfläche enable sollte aus dem Beispiel entfernt worden sein und sollte an erster Stelle außerhalb der Schleife verschoben worden sein. – nivs1978

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

für ein Datagrid mit einer Methode haben müssen, die Ihre Datagrid formatiert wird. Wenn Sie das Datagrid löschen möchten, rufen Sie einfach die Methode ab.

Hier ist meine Methode:

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 ist der Name des Datagridview