我正在使用C#.NET 2.0 Visual Studio 2005。
我遇到了奇怪的问题。
有一个简单的窗体,只有一个 DataGridView,其中column1为复选框(DataGridViewCheckboxColumn)。
然后,如果选中单元格中的复选框,我想删除选中的行。
声音非常简单,但它不会以某种方式删除所有已检查的行,我无法确定它为什么会以这种方式运行。
例如,我有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);
}
}
}
}
}
答案 0 :(得分:10)
当一行被删除时,它会发生行计数减少,所以如果你把你的代码放在for循环中并反向运行它可以正常工作看看:
for (int i = dataGridView1.Rows.Count -1; i >= 0 ; i--)
{
if ((bool)dataGridView1.Rows[i].Cells[0].FormattedValue)
{
dataGridView1.Rows.RemoveAt(i);
}
}
答案 1 :(得分:6)
你在迭代它时修改了一个集合。
使用删除列表,然后删除行。
答案 2 :(得分: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);
}
答案 3 :(得分:2)
这个解决方案给出了一点错误,我修复了添加1行:)
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);
}
答案 4 :(得分:1)
答案 5 :(得分: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
答案 6 :(得分: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
}