2013-04-22 47 views
0
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个。从我的DataGridView中删除多行后面留下1个

我们该如何解决?

+0

您发布的代码工作。我检查的一切都被删除。 – LarsTech 2013-04-22 19:00:52

+0

我检查的最后一项留下。我选择了3个项目,其中2个被删除。最后一个被选中但没有被删除 – 2013-04-22 19:03:44

+0

...并且我的代码没有得到相同的结果。 – LarsTech 2013-04-22 19:06:21

回答

1

EDITED

您可以通过SelectedRows属性删除。

确保MultiSelect属性设置为true的DataGrid中。

然后,你可以利用你的选择的情况下SelectedRows属性:

这是你需要什么,试试这个代码:

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

OR

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

SelectedRows是突出显示的行。我想获取复选框中有复选标记的行(这是每行的0列) – 2013-04-22 19:28:11

+0

@CocoaDev我编辑了答案:) – Obama 2013-04-22 19:33:32

2

已更新

这听起来像你想删除未检查的项目。

你将不得不做的是从底部开始到顶部,否则你将剩下额外的物品。

例子:

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:

基于以下您的意见,这个版本看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); 
     } 
    } 
    } 
} 

这是一个小更稳健的错误检查,并通过引用而不是由它的索引中删除行。

+0

我不想要“SelectedRows”。我想要检查的行(这是每行的第0列)。我想保留具有复选标记的行。 – 2013-04-22 19:28:34

+0

@CocoaDev你想保留具有复选标记的行吗?你的代码完全相反。 – LarsTech 2013-04-22 19:35:46

+0

一旦我得到它的工作方式,我可以做相反的事情来得到相反的结果。现在它不适用于复选框。做相反的事情,我可以搜索那些未被选中的复选框。 – 2013-04-22 19:38:32

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

代码页背后:

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