Wizard
Wizard

Reputation: 1162

How to clear a data grid view

I am trying to populate a DataGridView based on the selected item in a ComboBox, I have this part working.

However, I need to be able to clear the grid before adding the new data from a new item rather than it just adding on to the end.

How do I clear a DataGridView before adding items to it?

Upvotes: 46

Views: 268721

Answers (18)

Monzur
Monzur

Reputation: 1435

I found Solution from this Answers

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

Upvotes: 0

user3595795
user3595795

Reputation: 121

Solution is:

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

You could take this next instruction and would do the work with lack of perfomance. If you want to see the effect of that, put one of the next instruction where you need to clear the DataGridView into a try{} catch(...){} finally block and wait what occurs.

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

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

Upvotes: -6

Ismail Gunes
Ismail Gunes

Reputation: 558

For having a Datagrid you must have a method which is formatting your Datagrid. If you want clear the Datagrid you just recall the method.

Here is my method:

    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 is the name of DataGridView

Upvotes: 0

Lukas Greso
Lukas Greso

Reputation: 492

YourGrid.Items.Clear();
YourGrid.Items.Refresh();

Upvotes: -2

Ivan Aranda
Ivan Aranda

Reputation: 65

This is working to 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);
                }
            }`

Upvotes: -3

OssaRios
OssaRios

Reputation: 23

You could take this next instruction and would do the work with lack of perfomance. If you want to see the effect of that, put one of the 2 next instructions (Technically similars) where you need to clear the DataGridView into a try{} catch(...){} finally block and wait what occurs.

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

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

You improve this task but its not enough, there is a problem to reset a DataGridView, because of the colums that remains in the DataGridView object. Finally I suggest, the best way i've implemented in my home practice is to handle this gridView as a file with rows, columns: a record collection based on the match between rows and columns. If you can improve, then take your own choice a) or b): foreach or 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);
    }

Well, as a recomendation Never in your life delete the columns first, the order is before the rows after the cols, because logically the columns where created first and then the rows.It would be a penalty in terms of correct 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);
    }

Then, Put it inside a function or method.

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

Finally, call your new function ClearDataGridViewLoopWhile(); or ClearDataGridViewForEach(); where you need to use it, but its recomended when you are making queries and changing over severall tables that will load with diferents header names in the grieView. But if you want preserve headers here there is a solution given.

Upvotes: 2

Tiago Rodrigo
Tiago Rodrigo

Reputation: 13

The solution is:

dataGridView1.Rows.RemoveAt(0);

Clears the grid and preserves the columns.

Upvotes: -2

nate wew
nate wew

Reputation: 189

IF you want to clear not only Data, but also ComboBoxes, Checkboxes, try

dataGridView.Columns.Clear();

Upvotes: 7

Manish Mistry
Manish Mistry

Reputation: 44

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

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

Upvotes: 1

Jon649
Jon649

Reputation: 289

If it's bound to a datasource -

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

Worked for me.

Upvotes: 13

valhalla
valhalla

Reputation: 73

If you want to clear all the headers as well as the data, for example if you are switching between 2 totally different databases with different fields, therefore different columns and column headers, I found the following to work. Otherwise when you switch you have the columns/ fields from both databases showing in the grid.

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; 

Upvotes: 1

HarshPritesh
HarshPritesh

Reputation: 9

datatable.Clear();
dataGridView1.DataSource = datatable;

Upvotes: 0

vignesh
vignesh

Reputation: 9

refresh the datagridview and refresh the datatable

dataGridView1.Refresh();
datatable.Clear();

Upvotes: 0

Rohit Vyas
Rohit Vyas

Reputation: 1969

You can assign the datasource as null of your data grid and then rebind it.

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

Upvotes: 3

Trevor Pilley
Trevor Pilley

Reputation: 16393

Firstly, null the data source:

this.dataGridView.DataSource = null;

Then clear the rows:

this.dataGridView.Rows.Clear();

Then set the data source to the new list:

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

Upvotes: 101

Asif
Asif

Reputation: 2677

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

Upvotes: 1

Priyank Patel
Priyank Patel

Reputation: 6996

You can clear DataGridView in this manner

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

If it is databound then try this

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

Upvotes: 7

Pankaj Agarwal
Pankaj Agarwal

Reputation: 11309

DataGrid.DataSource = null;
DataGrid.DataBind();

Upvotes: 6

Related Questions