【问题标题】:How to clear a data grid view如何清除数据网格视图
【发布时间】:2012-10-19 17:02:02
【问题描述】:

我正在尝试根据 ComboBox 中的选定项目填充 DataGridView,这部分正在工作。

但是,我需要能够在从新项目添加新数据之前清除网格,而不是仅仅添加到末尾。

如何在向 DataGridView 添加项目之前清除它?

【问题讨论】:

标签: c# datagrid


【解决方案1】:

首先,清空数据源:

this.dataGridView.DataSource = null;

然后清除行:

this.dataGridView.Rows.Clear();

然后将数据源设置为新列表:

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

【讨论】:

  • 如果我不将数据源设为空会发生什么?
  • 不应该还有this.dataGridView.Columns.Clear();吗?
【解决方案2】:

如果它绑定到数据源 -

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

为我工作。

【讨论】:

  • 我知道这晚了大约 2 年半,但是如果 datagridview 没有绑定到数据源怎么办?如何在刷新数据网格之前清除它?
【解决方案3】:

你可以通过这种方式清除DataGridView

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

如果是databound,那么试试这个

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

【讨论】:

  • 如果是WinForm,DataBind不能和DataGridView一起使用。
【解决方案4】:

如果你不仅要清除数据,还要清除组合框、复选框,试试

dataGridView.Columns.Clear();

【讨论】:

    【解决方案5】:
    DataGrid.DataSource = null;
    DataGrid.DataBind();
    

    【讨论】:

    • 就我而言,由于某种原因,我无法使用 Clear()。我使用了这段代码,效果很好。
    【解决方案6】:

    您可以将数据源分配为数据网格的空值,然后重新绑定它。

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

    【讨论】:

    • 这是 DGV 而不是数据网格。容易犯错 - 我知道我已经做了足够多的时间了。
    【解决方案7】:

    您可以接受下一条指令,但会在缺乏表现的情况下完成这项工作。如果您想查看其效果,请将需要清除 DataGridView 的 2 个 next 指令(技术相似)之一放入 try{} catch(...){} finally 块并等待发生的情况。

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

    您改进了此任务,但还不够,重置 DataGridView 存在问题,因为 DataGridView 对象中保留有列。最后我建议,我在家庭实践中实现的最佳方法是将此 gridView 作为具有行、列的文件处理:基于行和列之间匹配的记录集合。如果可以改进,请自行选择 a) 或 b):foreach 或 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);
        }
    

    好吧,作为建议,在你的生活中永远不要先删除列,顺序是在列之后的行之前,因为从逻辑上讲,首先创建的列然后是行。就正确的分析而言,这将是一种惩罚。

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

    然后,将其放入函数或方法中。

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

    最后,调用你的新函数 ClearDataGridViewLoopWhile();或 ClearDataGridViewForEach();您需要在哪里使用它,但是当您进行查询和更改将在 grieView 中加载不同标题名称的多个表时,建议使用它。但是如果你想在这里保留标题,这里有一个解决方案。

    【讨论】:

      【解决方案8】:
      dataGridView1.Rows.Clear();
      dataGridView1.Refresh();
      

      【讨论】:

        【解决方案9】:

        如果您想清除所有标题以及数据,例如,如果您在具有不同字段的 2 个完全不同的数据库之间切换,因此不同的列和列标题,我发现以下工作。否则,当您切换时,两个数据库中的列/字段都会显示在网格中。

        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; 
        

        【讨论】:

          【解决方案10】:
          private void ClearGrid()
          {    
              if(this.InvokeRequired) this.Invoke(new Action(this.ClearGrid));
          
              this.dataGridView.DataSource = null;
              this.dataGridView.Rows.Clear();
              this.dataGridView.Refresh();
          }
          

          【讨论】:

            【解决方案11】:

            刷新datagridview并刷新datatable

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

            【讨论】:

              【解决方案12】:
              datatable.Clear();
              dataGridView1.DataSource = datatable;
              

              【讨论】:

              • 即使答案是正确的,我也总是会包含一些解释,因为用户可能不会仅仅看你的代码就理解它。
              【解决方案13】:

              为了拥有一个Datagrid,你必须有一个方法来格式化你的Datagrid。如果要清除 Datagrid,只需调用该方法即可。

              这是我的方法:

                  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 是 DataGridView 的名称

              【讨论】:

                【解决方案14】:

                解决办法是:

                dataGridView1.Rows.RemoveAt(0);
                

                清除网格并保留列。

                【讨论】:

                • 它只会删除 1 行。清除网格使用方法dataGridView1.Rows.Clear();
                【解决方案15】:
                YourGrid.Items.Clear();
                YourGrid.Items.Refresh();
                

                【讨论】:

                  【解决方案16】:

                  这对我有用

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

                  【讨论】:

                  • 当您可以按照 Trevor 的建议使用 Clear() 时,为什么要一次删除一个?另外,为什么每次循环运行时都启用一个按钮?按钮启用应该已经从示例中删除,并且应该首先移到循环之外。
                  【解决方案17】:

                  解决办法是:

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

                  您可以接受下一条指令,但会在缺乏表现的情况下完成这项工作。如果您想查看其效果,请将需要清除 DataGridView 的下一条指令放入 try{} catch(...){} finally 块并等待发生的情况。

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-05-12
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多