简体   繁体   中英

How to remove a row from gridview on Row Command?

I have a grid view where data is dyanmically added. I need an onRowCommand where the selected row will be deleted. I need the row to be deleted only from the grid view.

 protected void LoadDataTable()
    {
        string header = lblHeader.Text;
        string aa = tv.SelectedNode.Parent.Value;
        string child = tv.SelectedNode.Text;
        string parent = tv.SelectedNode.Parent.Text;

        var dt = new DataTable();
        dt.Columns.Clear();
        dt.Rows.Clear();
        dt.Columns.Add("TargetGLId");          
        dt.Columns.Add("TargetHead");
        dt.Columns.Add("Parent");
        dt.Columns.Add("Header");

        foreach (GridViewRow row in gvBudgetSetup.Rows)
        {
            var lblheader = (Label)row.FindControl("lblHeader");
            var lblparticular = (Label)row.FindControl("lblParticular");
            var lblGlId = (Label)row.FindControl("lblGLId");
            var lblparent = (Label)row.FindControl("lblParent");
            var dr = dt.NewRow();
            dr["TargetHead"] = lblparticular.Text;
            dr["TargetGLID"] = lblGlId.Text;
            dr["Parent"] = lblparent.Text;
            dr["Header"] = lblHeader.Text;
            dt.Rows.Add(dr);
        }            
        var dr1 = dt.NewRow();
        dr1["TargetHead"] = child;
        dr1["TargetGLID"] = tv.SelectedValue;
        dr1["Parent"] = parent;
        dr1["Header"] = header;

        dt.Rows.Add(dr1);
        gvBudgetSetup.DataSource = null;
        gvBudgetSetup.DataBind();
        gvBudgetSetup.DataSource = dt;
        gvBudgetSetup.DataBind();
    }

I have tried this code to delete the row but it is not working.

   protected void gvBudgetSetup_RowCommand(object sender, GridViewCommandEventArgs e)
    {
         if (e.CommandName == "Delete1")
        {
            // gvBudgetSetup.DeleteRow(e.Row.RowIndex);
            GridViewRow gvr = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
            int getRowIndex = gvr.RowIndex;

            gvBudgetSetup.DeleteRow(getRowIndex);
        }
    }

This is the Gridview created. The gridview is not connected to any database. The data in the gridview is added from the back-end codes.

  <asp:GridView ID="gvBudgetSetup" runat="server" CssClass="table1" AutoGenerateColumns="false" ShowFooter="true" OnSelectedIndexChanged="gvBudgetSetup_SelectedIndexChanged"
                 ShowHeaderWhenEmpty="true" OnRowDataBound="gvBudgetSetup_RowDataBound" OnRowCommand="gvBudgetSetup_RowCommand" OnRowDeleting="gvBudgetSetup_RowDeleting"  Width="100%">
                                       <FooterStyle CssClass="GridFooter" />
                        <RowStyle CssClass="GridItem" />
                            <columns>
                                   <asp:TemplateField HeaderText="Sn">
                                         <ItemTemplate>
                                <%# Container.DataItemIndex + 1 %>
                            </ItemTemplate>
                                    </asp:TemplateField>
                                  <asp:TemplateField HeaderText="GL Id">
                                     <ItemTemplate>
                                <asp:Label ID="lblGLId" runat="server" Text='<%# Bind("TargetGLID") %>'></asp:Label>
                            </ItemTemplate>
                                </asp:TemplateField>
                                  <asp:TemplateField HeaderText="Header">
                                      <ItemTemplate>
                                <asp:Label ID="lblHeader" runat="server" Text='<%# Bind("Header") %>'></asp:Label>
                            </ItemTemplate>
                                </asp:TemplateField>
                                 <asp:TemplateField HeaderText="Parent">
                                      <ItemTemplate>
                                <asp:Label ID="lblParent" runat="server" Text='<%# Bind("Parent") %>'></asp:Label>
                            </ItemTemplate>
                                </asp:TemplateField>
                                <asp:TemplateField HeaderText="Child">
                                      <ItemTemplate>
                                <asp:Label ID="lblParticular" runat="server" Text='<%# Bind("TargetHead") %>'></asp:Label>
                            </ItemTemplate>
                                </asp:TemplateField>

                            <asp:TemplateField HeaderText="Delete">
                            <ItemTemplate>
                                <asp:LinkButton runat="server"  Text="Delete" CommandName="Delete1"
                                    ID="lnkDelete"></asp:LinkButton>
                            </ItemTemplate>
                                   </asp:TemplateField>
                            </columns>
                                      <EmptyDataTemplate>
                            "There are no data to display..."
                        </EmptyDataTemplate>
                            </asp:GridView>
    GridViewRow gvr = (GridViewRow)(((ImageButton)e.CommandSource).NamingContainer); 
int getRowIndex = gvr.RowIndex;

    gvBudgetSetup.DeleteRow(getRowIndex);

Use this updated code

Better way to do is have a flag in the data source that one row is flagged(deleted) and bind it again. To delete a datarow from a GridViewEvent, you have to re bind the datasource again.

Introduce a Flag column in your data source

  protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName == "Delete") { //Update the flag in datasource using the CommandArgument value //Bind the datasource again. } } protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { } 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM