8
votes

Comment supprimer des lignes dans la vue de grille de données où la case à cocher est cochée?

J'utilise c # .NET 2.0 Visual Studio 2005.

Je rencontre un problème étrange.

Il existe une simple fenêtre de fenêtre avec juste une seule DataGridView avec Colonne1 étant Cochez la case (DataGridViewCheckeckboxcolumn) .

Ensuite, si la case à cocher de la cellule est cochée, je veux supprimer la ligne vérifiée.

Son vraiment simple mais il ne supprime pas toutes les lignes vérifiées en quelque sorte, Et je ne peux pas vraiment comprendre pourquoi il se comporte de cette façon.

Par exemple, j'ai 5 lignes et vérifié toutes les cases dans chaque rangée, mais elle supprime seulement 3 rangées. Quelqu'un a-t-il déjà vu cela avant? Est-ce un bug ou je fais quelque chose de mal? xxx


4 commentaires

C'est une application de formulaire de fenêtre et je ne le vois pas dans mon projet explorer


Désolé masato-san, mon erreur. :)


Je pense que courir pour la boucle d'inverse est une approche meilleure et plus rapide, car vous n'aurez pas d'objet de liste supplémentaire pour stocker des lignes TODelete et que vous n'ayez pas besoin d'une seule boucle pour faire une tâche.


@Charlie: Merci pour l'aperçu. En outre, une autre cause ma suppression de la grille se comportait de manière inattendue était que je n'ai pas changé. mygrrid.camedidit (DataGridViefDaTerrorContexts.commit);


7 Réponses :


6
votes

Vous êtes modifié une collection lors de l'itération.

Utilisez une liste de suppression et de retirer les lignes.


1 commentaires

Merci pour la réponse rapide, pourriez-vous expliquer un peu plus de détails? Je ne trouve pas la méthode de suppression ...



1
votes

@chen Kinnrot est absolument sur l'argent! Vous ne supprimerez toujours que N% 2 lignes lorsque vous exécutez votre fonction, donc si vous avez 10 lignes, vous les supprimeriez que 51, et 101 serait 51, etc. ITÉTACHER sur la collection pour trouver les cases à cocher, puis supprimez ces cases. Lignes. La meilleure solution serait de joindre un événement à la case à cocher qui fonctionne automatiquement lorsque vous cliquez sur le bouton1.


0 commentaires

13
votes

Son activité Lorsque une ligne est supprimée, les lignes comptent également les décomptes ainsi si vous mettez votre code dans la boucle et exécutez-le en sens inverse, il fonctionnerait bien avoir un look:

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


0 commentaires

6
votes

Vous modifiez une collection lors de l'itération. Essayez comme ça xxx


1 commentaires

Utiliser la coulée dans la déclaration IF ci-dessus: Si ((BOOL) Row.Cells [0] .Value)



2
votes

Cette solution donne une petite erreur, j'ai corrigé Ajouter 1 ligne :)

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);
}


0 commentaires

0
votes
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();
   }
For detailed code visit:
http://www.gtuguide.com/2014/05/deleting-multiple-rows-in-gridview.html

0 commentaires

0
votes
  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
    }

0 commentaires