0
votes

I have two textboxes three button and two grid-view when i enter value in textboex and press add button value added in datatable and can be seen grid-view and when i click on submit button i can view that detail in my next girdview now when i select any row from 1st grid view and click on delete button it remove that row from 1st grid view till then all code work well now what i want is when i delete row from 1st gridview and press on submit button i can view only that data in 2nd gridview that present in 1st gridview

here is my code:

private void BindGrid(int rowcount)
{
     DataTable dt = new DataTable();
     DataRow dr;

     dt.Columns.Add("First Name", typeof(String));
     dt.Columns.Add("Last Name", typeof(String));

     if (ViewState["CurrentData"] != null)
     {
        for (int i = 0; i < rowcount + 1; i++)
        {
            dt = (DataTable)ViewState["CurrentData"];
            if (dt.Rows.Count > 0)
            {
                dr = dt.NewRow();
                dr[0] = dt.Rows[0][0].ToString();

            }
        }
        dr = dt.NewRow();
        dr[0] = TextBox1.Text;
        dr[1] = TextBox2.Text;
        dt.Rows.Add(dr);
    }
    else
    {
        dr = dt.NewRow();
        dr[0] = TextBox1.Text;
        dr[1] = TextBox2.Text;


        dt.Rows.Add(dr);

    }

     // If ViewState has a data then use the value as the DataSource
     if (ViewState["CurrentData"] != null)
     {
         GridView1.DataSource = (DataTable)ViewState["CurrentData"];
         GridView1.DataBind();

    }
     else
    {
         // Bind GridView with the initial data assocaited in the DataTable
         GridView1.DataSource = dt;
         GridView1.DataBind();
    }
     // Store the DataTable in ViewState to retain the values
      ViewState["CurrentData"] = dt;

 }

click event on add button:

protected void Button1_Click(object sender, EventArgs e)
     {
         // Check if the ViewState has a data assoiciated within it. If
         if (ViewState["CurrentData"] != null)
        {
             DataTable dt = (DataTable)ViewState["CurrentData"];
             int count = dt.Rows.Count;
             BindGrid(count);
         }
         else
         {
            BindGrid(1);
         }
          TextBox1.Text = string.Empty;
          TextBox2.Text = string.Empty;
          TextBox1.Focus();
      }
}

submit button event:

if (ViewState["CurrentData"] != null)
        {
            GridView2.DataSource = (DataTable)ViewState["CurrentData"];
            GridView2.DataBind();
        }

delete button event:

protected void DeleteButton_Click(object sender, EventArgs e)
    {

        foreach (GridViewRow row in GridView1.Rows)
       {
           CheckBox cb = (CheckBox)row.FindControl("CheckBox1");
           if (cb != null && cb.Checked)
           {
               row.Visible = false;
           }
           else
           {
                Response.Write("Select check box to Delete");
           }
       }
   }

this is my aspx page code:

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default4.aspx.cs" Inherits="Default4" %>

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
  <head runat="server">
  <title></title>
  </head>
  <body>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox ID="TextBox1" runat="server"/>&nbsp;&nbsp;&nbsp;&nbsp;
  <asp:TextBox ID="TextBox2" runat="server"/>&nbsp;&nbsp;&nbsp;<asp:DropDownList 
              ID="DropDownList1" runat="server">
              <asp:ListItem>ADT</asp:ListItem>
              <asp:ListItem>INF</asp:ListItem>
              <asp:ListItem>SC</asp:ListItem>
           </asp:DropDownList>
   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   <asp:Button ID="Button1" runat="server" Text="Add" OnClick="Button1_Click" />
  &nbsp;&nbsp;&nbsp;&nbsp;<br />
          &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
          <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" 
             GridLines="None">
             <AlternatingRowStyle BackColor="White" />
             <EditRowStyle BackColor="#2461BF" />
             <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
             <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
              <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
             <RowStyle BackColor="#EFF3FB" />
             <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> 
             <SortedAscendingCellStyle BackColor="#F5F7FB" />
             <SortedAscendingHeaderStyle BackColor="#6D95E1" />
             <SortedDescendingCellStyle BackColor="#E9EBEF" />
             <SortedDescendingHeaderStyle BackColor="#4870BE" />
             <Columns>
            <asp:TemplateField>
             <ItemTemplate>
                <asp:CheckBox ID="CheckBox1" runat="server"  />
             </ItemTemplate>
        </asp:TemplateField>
     </Columns>

         </asp:GridView>

         <br />
         <asp:Button ID="btnSubmit" runat="server" onclick="btnSubmit_Click" 
             Text="Submit" />
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          <asp:Button ID="DeleteButton" runat="server" Text="Delete" 
              onclick="DeleteButton_Click" />
           &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

          <br />
      <br />
         <asp:GridView ID="GridView2" runat="server" CellPadding="4" ForeColor="#333333" 
             GridLines="None">
            <AlternatingRowStyle BackColor="White" />
            <EditRowStyle BackColor="#2461BF" />
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> 
            <RowStyle BackColor="#EFF3FB" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> 
            <SortedAscendingCellStyle BackColor="#F5F7FB" />
            <SortedAscendingHeaderStyle BackColor="#6D95E1" />
            <SortedDescendingCellStyle BackColor="#E9EBEF" />
            <SortedDescendingHeaderStyle BackColor="#4870BE" />
         </asp:GridView>
        </div>
     </form>
 </body>
</html>

Thanks in advance...

1
@gzaxx thanks can you help me on thisamitesh

1 Answers

1
votes

First of all you are not deleting Data from DataTable but just hiding row in DataGridView1.

If you want to delete it then in your delete event do this:

var dt = (DataTable)ViewState["CurrentData"];
if (dt != null)
{
     var firstname = (row.FindControl("labelFirstName") as Label).Text; //my guess that you are binding DataRows to labels in grid view? if not this has to be changed
     var lastname = (row.FindControl("labelLastName") as Label).Text; //same as above

     var row = dt.AsEnumerable().FirstOrDefault(x => x.Field<string>("First Name") == firstname && x.Field<string>("Last Name") == lastname);

     dt.Rows.Remove(row);     

     GridView1.DataSource = dt;
     GridView1.DataBind();

     GridView2.DataSource = dt;
     GridView2.DataBind();

     ViewState["CurrentData"] = dt;
}

And this is how you delete row from DataTable.

But if you wanted to only hide them then you have to find row in DataGridView2 with the same data and hide it as well.

foreach (GridViewRow row in GridView1.Rows)
{
    CheckBox cb = (CheckBox)row.FindControl("CheckBox1");
    if (cb != null && cb.Checked)
    {
        row.Visible = false;
        var firstname = (row.FindControl("labelFirstName") as Label).Text; //my guess that you are binding DataRows to labels in grid view? if not this has to be changed
        var lastname = (row.FindControl("labelLastName") as Label).Text; //same as above

        foreach (GridViewRow row in GridView2.Rows)
        {
             var found = false;
             // logic to search for row
             if (found)
             {
                  row.Visible = false;
             }
        }
    }
    else
    {
        Response.Write("Select check box to Delete");
    }
}

I hope I understood your question correctly and that is what you wanted :). If not, write a comment and I will help further :)


This one should work.

protected void DeleteButton_Click(object sender, EventArgs e)
{
    var dt = (DataTable)ViewState["CurrentData"];

    if (dt == null)
    {
        return;
    }

    List<DataRow> rowsToDelete = new List<DataRow>();
    foreach (GridViewRow row in GridView1.Rows)
    {        
        CheckBox cb = (CheckBox)row.FindControl("CheckBox1");
        if (cb != null && cb.Checked)
        {
            row.Visible = false;

            //remove row by its index as it should GridViewRow index == DataRow index
            //it is not the best way but from your code I dont have information how your GridView looks
            rowsToDelete.Add(dt.Rows[row.RowIndex]);
        }
        else
        {
            Response.Write("Select check box to Delete");
        }
    }

    for (int i = 0; rowsToDelete.Count; i++)
    {
        dt.Rows.Remove(rowsToDelete[i]);
    }
}

This edit is correct, last one not so much, overlooked that there could be more rows to be deleted :).

To change data in DataBound GridView you have to modify its DataSource not GridView itself! That's why you have to delete item from your DataTable and rebind DataSource to changes took place in both of your Grids :)