【问题标题】:Deleting multiple rows from my DataGridView leaves 1 behind从我的 DataGridView 中删除多行会留下 1
【发布时间】:2013-04-22 18:43:22
【问题描述】:
List<DataGridViewRow> rowsToDelete = new List<DataGridViewRow>();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;
    if (Convert.ToBoolean(chk.Value) == true)
        rowsToDelete.Add(row);
}
//loop through the list to delete rows added to list<T>:
foreach (DataGridViewRow row in rowsToDelete)
        dataGridView1.Rows.Remove(row);

我选择了 3 个项目,它删除了 2 个但留下了 1 个。

我们如何解决它?

【问题讨论】:

  • 您发布的代码有效。我检查的所有内容都会被删除。
  • 我检查的最后一项被留下了。我选择了 3 个项目,其中 2 个被删除。最后一个已检查但未删除
  • ...我没有得到与您的代码相同的结果。

标签: c# datagrid datagridview


【解决方案1】:

更新

听起来您想删除未选中的项目。

你要做的就是从底部开始,到顶部,否则你会留下多余的物品。

例子:

for (int i = DataGridView1.SelectedRows.Count - 1; -1 < i; i--)
{
   object objChecked = DataGridView1.SelectedRows[i].Cells[0].Value;
   if ((objChecked  != null) && !(bool)objChecked)
   {
     DataGridView1.Rows.RemoveAt(i);
   }
}

更新 2:

根据您下面的 cmets,此版本查看 Rows 而不是 SelectedRows

在开始循环之前检查Rows 是否存在:

if ((0 < DataGridView1.Rows.Count) && (0 < DataGridView1.Columns.Count)) 
{
  for (int i = DataGridView1.Rows.Count - 1; -1 < i; i--)
  {
    var row = DataGridView1.Rows[i];
    if ((row.Cells[0].Value != null) && (row.Cells[0].Value != DBNull.Value))
    {
      bool isChecked = (bool)row.Cells[0].Value;
      if (isChecked)
      {
        DataGridView1.Rows.Remove(row);
      }
    }
  }
}

它的错误检查更加健壮,并且通过引用而不是通过索引删除行。

【讨论】:

  • 我不想要“SelectedRows”。我想要未检查的行(即每行的第 0 列)。我想保留带有复选标记的行。
  • @CocoaDev 您想保留带有复选标记的行吗?你的代码正好相反。
  • 一旦我让它以一种方式工作,我可以做相反的事情来获得相反的结果。现在它不能与存在的复选框一起使用。相反,我可以搜索那些未被选中的复选框。
  • 啊!你将不得不从底部开始,然后一路向上。查看更新的代码。
  • 感谢更新代码。 dataGridView1.Rows.RemoveAt 永远不会执行。我认为是因为“SelectedRows”。 CTRL+CLICK 多行时不是 selectedrows 吗?如果没有选择行但它们被选中怎么办。我们如何检查所有被选中标记的行?
【解决方案2】:

已编辑

您可以通过 SelectedRows 属性删除。

确保 MultiSelect 属性在您的数据网格上设置为 true。

然后,您可以根据自己的选择使用SelectedRows 属性:

这是你需要的,试试这个代码:

for (int i = dataGridView1.Rows.Count -1; i >= 0 ; i--)
{
    if ((bool)dataGridView1.Rows[i].Cells[0].FormattedValue)
    {
        dataGridView1.Rows.RemoveAt(i);
    }
}

foreach (DataGridViewRow row in DataGridView1.SelectedRows)
{
    DataGridView1.Rows.Remove(row);
}

【讨论】:

  • SelectedRows 是突出显示的行。我想获取复选框中有复选标记的行(每行的第 0 列)
【解决方案3】:

ASPXPAGE:

<strong>Asp.Net : Delete Multiple Records form datagridview in one time<br />
        </strong>

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"
            CellPadding="4" EnableModelValidation="True" ForeColor="Black">
            <Columns>
                <asp:TemplateField>
                    <EditItemTemplate>
                        <asp:CheckBox ID="CheckBox1" runat="server" />
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:CheckBox ID="CheckBox1" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="id" HeaderText="Sr No" />
                <asp:BoundField DataField="doc_name" HeaderText="Name" />
                <asp:BoundField DataField="doc_add" HeaderText="Address" />
                <asp:BoundField DataField="doc_mob" HeaderText="Mobile No" />
                <asp:BoundField DataField="doc_email" HeaderText="Email" />
            </Columns>
            <FooterStyle BackColor="#CCCC99" ForeColor="Black" />
            <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="Right" />
            <SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
        </asp:GridView>
        <br />
        <asp:Button ID="Button1" runat="server" Font-Size="12pt"
            onclick="Button1_Click1" Text="Delete" />
        <br />

页面背后的代码:

SqlConnection conn = new SqlConnection(@"server=server-pc; database=HMS; integrated security=true");
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {
            load_data();
        }
    }

   public void load_data()
    {
        SqlDataAdapter adp = new SqlDataAdapter("select * from doc_master", conn);
        DataSet ds = new DataSet();
        adp.Fill(ds);
        GridView1.DataSource = ds.Tables[0];
        GridView1.DataBind();
    }
   protected void Button1_Click1(object sender, EventArgs e)
   {
       CheckBox ch;
       for (int i = 0; i < GridView1.Rows.Count; i++)
       {
           ch = (CheckBox)GridView1.Rows[i].Cells[0].Controls[1];
           if (ch.Checked == true)
           {
      int id = Convert.ToInt32(GridView1.Rows[i].Cells[1].Text);
      SqlCommand cmd = new SqlCommand("delete from doc_master where ID=" + id + " ", conn);
      conn.Open();
      cmd.ExecuteNonQuery();
      conn.Close();
           }
       }

       load_data();
   }

详细代码访问:: http://www.gtuguide.com/2014/05/deleting-multiple-rows-in-gridview.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多