0

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

这是我的代码:

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>

提前致谢...

4

1 回答 1

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并将数据源重新绑定到您的两个网格中发生的更改:)

于 2013-02-08T08:42:27.347 回答