Как удалить строки в сетке данных, где установлен флажок? - PullRequest
8 голосов
/ 22 июня 2011

Я использую 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);
                }
            }
        }
    }
}

Ответы [ 6 ]

10 голосов
/ 22 июня 2011

это происходит, когда убирается одна строка, и число строк уменьшается, поэтому, если вы поместите свой код в цикл for и запустите его в обратном порядке, он будет работать нормально, посмотрите:

for (int i = dataGridView1.Rows.Count -1; i >= 0 ; i--)
{
    if ((bool)dataGridView1.Rows[i].Cells[0].FormattedValue)
    {
        dataGridView1.Rows.RemoveAt(i);
    }
}
6 голосов
/ 22 июня 2011

Вы изменяете коллекцию, повторяя ее. Попробуйте вот так

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);
}
6 голосов
/ 22 июня 2011

Вы изменяете коллекцию, повторяя ее.

Используйте список удаления, а затем удалите строки.

2 голосов
/ 01 сентября 2012

это решение дает небольшую ошибку, я исправил добавление 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);
}
1 голос
/ 22 июня 2011

@ Чен Кинрот, абсолютно на деньги!Вы всегда будете удалять только n% 2 строк при запуске вашей функции, поэтому, если у вас есть 10 строк, то вы удалите 5, а 101 будет 51 и т. Д. Выполните итерацию по коллекции, чтобы найти флажки, а затем удалите тестрок.Лучшим решением было бы прикрепить событие к флажку, который автоматически запускается при нажатии кнопки 1.

0 голосов
/ 22 мая 2014
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

...