c# - 将检索到的数据保存在另一个 Gridview 中的 Griview 中
问题描述
问题是我在两种不同的形式上使用了 2 个网格视图;第一个是显示数据库中的项目,它工作正常。当我选择一行并单击一个按钮时,该行将转到第二个表单“购物车表单”上的 gridview #2 我将显示该行,但是当我关闭表单或从 gridview #1 中选择另一行时想要检索它,已经检索到的第一行将被新的选择行替换!如何将所有选择项保留在 gridview 2 中?
这是网格视图 1 的代码
private void Buyer_Main_Page_Load(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection("Data Source=DESKTOP-CJGIQ74;Initial Catalog=Items;Integrated Security=True");
SqlDataAdapter adp = new SqlDataAdapter("SELECT * FROM list", con);
DataTable dt = new DataTable();
adp.Fill(dt);
foreach (DataRow item in dt.Rows)
{
int n = Gridview.Rows.Add();
Gridview.Rows[n].Cells[0].Value = item[0].ToString();
Gridview.Rows[n].Cells[1].Value = item["Name"].ToString();
Gridview.Rows[n].Cells[2].Value = item["Price"].ToString();
Gridview.Rows[n].Cells[3].Value = item["Quantity"].ToString();
}
}
将项目检索到 Gridview 2 的按钮代码
private void button1_Click_1(object sender, EventArgs e)
{
Checkout datagrid = new Checkout(Gridview.SelectedRows[0].Cells[0].Value.ToString(),
Gridview.SelectedRows[0].Cells[1].Value.ToString(),
Gridview.SelectedRows[0].Cells[2].Value.ToString(),
Gridview.SelectedRows[0].Cells[3].Value.ToString());
datagrid.Show();
}
GridView 2 显示检索到的项目
public Checkout(string ID, string name, string price , string quantity)
{
InitializeComponent();
dataGridView1.Rows.Add();
dataGridView1.Rows[0].Cells[0].Value = ID;
dataGridView1.Rows[0].Cells[1].Value = name;
dataGridView1.Rows[0].Cells[2].Value = price;
dataGridView1.Rows[0].Cells[3].Value = quantity;
}
所以基本上我想将检索到的数据保留在网格视图 2 中,以便用户可以选择他想要购买的东西并检查所选项目。另外,任何人都可以帮助我了解数量我如何只选择一个将从库存或库存中减去的数量
解决方案
第一个 GridView
<asp:GridView ID="gvAll" runat="server"
AutoGenerateColumns = "false" Font-Names = "Arial"
Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B"
HeaderStyle-BackColor = "green" AllowPaging ="true"
OnPageIndexChanging = "OnPaging" PageSize = "10" >
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="chkAll" runat="server" onclick = "checkAll(this);"
AutoPostBack = "true" OnCheckedChanged = "CheckBox_CheckChanged"/>
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="chk" runat="server" onclick = "Check_Click(this)"
AutoPostBack = "true" OnCheckedChanged = "CheckBox_CheckChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField = "CustomerID" HeaderText = "Customer ID"
HtmlEncode = "false" />
<asp:BoundField DataField = "ContactName" HeaderText = "Contact Name"
HtmlEncode = "false" />
<asp:BoundField DataField = "City" HeaderText = "City"
HtmlEncode = "false" />
</Columns>
<AlternatingRowStyle BackColor="#C2D69B" />
</asp:GridView>
辅助网格视图
<asp:GridView ID="gvSelected" runat="server"
AutoGenerateColumns = "false" Font-Names = "Arial"
Font-Size = "11pt" AlternatingRowStyle-BackColor = "#C2D69B"
HeaderStyle-BackColor = "green" EmptyDataText = "No Records Selected" >
<Columns>
<asp:BoundField DataField = "CustomerID" HeaderText = "Customer ID" />
<asp:BoundField DataField = "ContactName" HeaderText = "Contact Name" />
<asp:BoundField DataField = "City" HeaderText = "City" />
</Columns>
</asp:GridView>
private void BindGridone()
{
string constr = ConfigurationManager
.ConnectionStrings["conString"].ConnectionString;
string query = " select CustomerID, ContactName, City from customers";
SqlConnection con = new SqlConnection(constr);
SqlDataAdapter sda = new SqlDataAdapter(query, con);
DataTable dt = new DataTable();
sda.Fill(dt);
gvAll.DataSource = dt;
gvAll.DataBind();
}
GetData 函数只检索用户选中复选框的记录,将它们添加到 DataTable,然后将 DataTable 保存到 ViewState
private void GetData()
{
DataTable dt;
if (ViewState["SelectedRecords"] != null)
dt = (DataTable)ViewState["SelectedRecords"];
else
dt = CreateDataTable();
CheckBox chkAll = (CheckBox)gvAll.HeaderRow
.Cells[0].FindControl("chkAll");
for (int i = 0; i < gvAll.Rows.Count; i++)
{
if (chkAll.Checked)
{
dt = AddRow(gvAll.Rows[i], dt);
}
else
{
CheckBox chk = (CheckBox)gvAll.Rows[i]
.Cells[0].FindControl("chk");
if (chk.Checked)
{
dt = AddRow(gvAll.Rows[i], dt);
}
else
{
dt = RemoveRow(gvAll.Rows[i], dt);
}
}
}
ViewState["SelectedRecords"] = dt;
}
private DataTable CreateDataTable()
{
DataTable dt = new DataTable();
dt.Columns.Add("CustomerID");
dt.Columns.Add("ContactName");
dt.Columns.Add("City");
dt.AcceptChanges();
return dt;
}
private DataTable AddRow(GridViewRow gvRow, DataTable dt)
{
DataRow[] dr = dt.Select("CustomerID = '" + gvRow.Cells[1].Text + "'");
if (dr.Length <= 0)
{
dt.Rows.Add();
dt.Rows[dt.Rows.Count - 1]["CustomerID"] = gvRow.Cells[1].Text;
dt.Rows[dt.Rows.Count - 1]["ContactName"] = gvRow.Cells[2].Text;
dt.Rows[dt.Rows.Count - 1]["City"] = gvRow.Cells[3].Text;
dt.AcceptChanges();
}
return dt;
}
private DataTable RemoveRow(GridViewRow gvRow, DataTable dt)
{
DataRow[] dr = dt.Select("CustomerID = '" + gvRow.Cells[1].Text + "'");
if (dr.Length > 0)
{
dt.Rows.Remove(dr[0]);
dt.AcceptChanges();
}
return dt;
}
protected void OnPaging(object sender, GridViewPageEventArgs e)
{
GetData();
gvAll.PageIndex = e.NewPageIndex;
BindGridone();
SetData();
}
protected void CheckBox_CheckChanged(object sender, EventArgs e)
{
GetData();
SetData();
BindGridtwo();
}
private void BindGridtwo()
{
DataTable dt = (DataTable)ViewState["SelectedRecords"];
gvSelected.DataSource = dt;
gvSelected.DataBind();
}
推荐阅读
- python - 检查 pandas 数据框中的一系列单元格是否为 NaN 比使用 for 循环、math.isnan() 和 df.iloc() 更快的方法?
- android - 阴影映射在 Android 上的 OpenGL ES 3.0 中不起作用
- java - 无法在之间传递数据
testng 套件中的标签 - php - PHP foreach 循环正在渲染一个额外的列表项
- javascript - Express.js:简单的 Get 请求需要一段时间才能加载?
- pointers - 来自其他指针的 C 指针内容分配
- java - Collectors.groupingBy 基于嵌套的静态类属性
- python - Python:获得路径中所有父母的可迭代的优雅方法
- javascript - javascript 正则表达式如何匹配这个 'And' 'Or'
- alamofire - 你如何在 Alamofire 5 中实现 RequestAdapter?