如何在数据网格视图中删除已选中复选框的行?

8
我正在使用C# .NET 2.0 Visual Studio 2005。
我遇到了一个奇怪的问题。
有一个简单的窗体,只有一个包含复选框(DataGridViewCheckboxColumn)的DataGridView列1。
如果单元格中的复选框被选中,我想要删除已选中的行。
听起来非常简单,但它并不能删除所有选中的行,而且我真的不知道为什么会这样。
例如,我有5行,并选中了每一行的复选框,但它只删除了3行。有人见过这种情况吗?这是一个错误还是我做错了什么?
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //when I click the button, all checked row should be removed
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in dataGridView1.Rows)
            {
                if ((bool)row.Cells[0].Value)
                {
                    dataGridView1.Rows.Remove(row);
                }
            }
        }
    }
}

这是一个窗体应用程序,但我在项目资源管理器中找不到它。 - Meow
对不起,Masato先生,是我的错误。 :) - Bibhu
2
我认为倒序运行循环是更好、更快的方法,因为你不需要额外的列表对象来存储要删除的行,而且你只需要一个循环就可以完成整个任务。 - love Computer science
@Charlie:感谢您的见解。另外,导致我的网格删除行为出现意外情况的另一个原因是我没有提交更改。myGrid.CommitEdit(DataGridViewDataErrorContexts.Commit); - Meow
7个回答

14

当删除一行时,行数也会减少,因此如果您将代码放在for循环中并按相反顺序运行它,则可以正常工作,请看:

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

6
您正在迭代修改集合。请尝试以下方法:
List<DataGridViewRow> toDelete = new List<DataGridViewRow>();
foreach (DataGridViewRow row in dataGridView1.Rows) {
    if (row.Cells[0].Value == true) {
        toDelete.Add(row);
    }
}
foreach (DataGridViewRow row in toDelete) {
    dataGridView1.Rows.Remove(row);
}

在上面的if语句中使用强制类型转换:if ((bool)row.Cells[0].Value) - user2430797

6

您正在迭代修改一个集合。

使用删除列表,然后移除行。


谢谢您的快速回复,能否再详细解释一下?我找不到删除方法... - Meow

2

这个解决方案有一点错误,我通过添加一行代码进行了修复 :)

List<DataGridViewRow> toDelete = new List<DataGridViewRow>();

foreach (DataGridViewRow row in dataGridView1.Rows) 
{
  bool s = Convert.ToBoolean(row.Cells[0].Value) //added this line

  if (s == true) 
    {
        toDelete.Add(row);
    }
}

foreach (DataGridViewRow row in toDelete) 
{
    dataGridView1.Rows.Remove(row);
}

1

@Chen Kinnrot,绝对是正确的!当您运行函数时,您总是只会删除n%2行,因此如果您有10行,则会删除5行,101行将是51行等。迭代集合以查找哪些复选框已被选中,然后删除这些行。更好的解决方案是将事件附加到复选框上,当单击button1时自动运行。


0
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 />



Code Behind Page:
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


0
  protected void btnDelRow_Click(object sender, EventArgs e)
    {
        #region Delete Row from data list Grid On Behalf of checkbox from dyanamically added grid
        int ClSno = 0;  /*Use For Sitewise New Serial No*/
        foreach (DataListItem dst in dstBillDetails.Items)
        {
            ClSno = ClSno + 1;        
            Label lbl_SChkFlag = (Label)dst.FindControl("lblSChkFlag");        
            GridView Grid_B = (GridView)dst.FindControl("GridB");
            if (lbl_SChkFlag.Text == "0")
            {
                int Newbillflg = 0;/**If SiteCode Is Zero Then Usefull**/
                foreach (GridViewRow gvr in Grid_B.Rows)
                {
                    #region
                    Label lbl_grdId = (Label)gvr.FindControl("lblgrdId");
                    CheckBox chk_dstgrdlst = (CheckBox)gvr.FindControl("chkdstgrdlst");
                  
                    if (chk_dstgrdlst.Checked == true)
                    {
                        if (Grid_B.Rows.Count > 1)
                        {
                        
                            gvr.Style["display"] = "none";
                            lbl_grdId.Text = "1";                          
                        }
                        else
                        {/**When Gridview Row is Zero**/
                            Grid_B.Visible = false;
                            lbl_grdId.Text = "1";
                            /**When Gridview Row is Zero**/
                        }
                      
                    }
                    #endregion
                }
            }
        }
        #endregion
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接