当我在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"/>
<asp:TextBox ID="TextBox2" runat="server"/> <asp:DropDownList
ID="DropDownList1" runat="server">
<asp:ListItem>ADT</asp:ListItem>
<asp:ListItem>INF</asp:ListItem>
<asp:ListItem>SC</asp:ListItem>
</asp:DropDownList>
<asp:Button ID="Button1" runat="server" Text="Add" OnClick="Button1_Click" />
<br />
<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" />
<asp:Button ID="DeleteButton" runat="server" Text="Delete"
onclick="DeleteButton_Click" />
<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>
提前致谢...
答案 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,以便在你的两个网格中发生变化:)