如何将数据从一个gridview复制到另一个gridview

时间:2013-02-08 08:13:05

标签: c# asp.net gridview datatable

当我在textboex中输入值并按下数据表中添加的添加按钮值时,我有两个文本框三个按钮和两个网格视图,可以看到网格视图,当我点击提交按钮时,我可以在下一个查看该详细信息girdview现在,当我从第一个网格视图中选择任何行并单击删除按钮时,它从第一个网格视图中删除该行,直到所有代码现在正常工作我想要的是当我从第一个gridview删除行并按下提交按钮时我可以查看只有第二个gridview中出现在第一个gridview中的数据

这是我的代码:

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;

 }

点击添加按钮上的事件:

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

提交按钮事件:

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

删除按钮事件:

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

这是我的aspx页面代码:

 <%@ 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>

提前致谢...

1 个答案:

答案 0 :(得分:1)

首先,您不是要从DataTable删除数据,而只是在DataGridView1中隐藏行。

如果要删除它,请在删除事件中执行以下操作:

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

这就是你从DataTable中删除行的方法。

但是如果你只想隐藏它们,那么你必须在DataGridView2中找到具有相同数据的行并隐藏它。

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

我希望我能正确理解你的问题,这就是你想要的:)。如果没有,请写评论,我会进一步帮助:)


这个应该有效。

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

这个编辑是正确的,最后一个不是那么多,忽略了可能有更多的行要删除:)。

要更改DataBound GridView中的数据,您必须修改其DataSource而不是GridView本身!这就是为什么你必须从你的DataTable删除项目并重新绑定DataSource,以便在你的两个网格中发生变化:)