如何使用GridView中选定的行作为另一个页面中GridView的源

本文关键字:GridView 另一个 的源 何使用 | 更新日期: 2023-09-27 18:10:03

我正在Visual Studio中编写一个网站,有点像在线图书馆。我在第一页上有一个GridView,它显示了数据源中可用的所有书籍和数据源中也包含的一些其他属性。GridView包含复选框,用户可以通过选中复选框来选择他想订购的图书。我的问题是,我如何使用所选行中的数据,即具有其属性的图书列表,并在另一个页面上显示该列表,以便用户能够知道他选择了哪些项目?

我尝试在FirstPage上使用for循环:

   protected void Page_Load(object sender, EventArgs e)
    {
        List<int> ids = new List<int>();
         if (!IsPostBack)
        {
         }
        else
         {
             for (int i = 0; i < GridView1.Rows.Count; i++)
             {
                 int bookID = (int)GridView1.DataKeys[i][0];
                 CheckBox cb = (CheckBox)GridView1.Rows[i].FindControl("CheckBox");
                 if (cb.Checked)
                 {
                     ids.Add(bookID);
                 }
             }
             Session["Ids"] = ids;
             Response.Redirect("SecondPage.aspx"); 
         }
    }

和在SecondPage上:

protected void Page_Load(object sender, EventArgs e)
{
    DataTable dtBooks = new DataTable("Books");
    dtBooks.Columns.Add(new DataColumn("ID", typeof(int)));
    if (!IsPostBack)
    {
        var list = (List<int>)Session["Ids"];
        foreach (int id in list)
        {
            if (Request.QueryString["bookID" + id] != null)
            {
                DataRow row;
                row = dtBooks.NewRow();
                row["ID"] = Request.QueryString["bookID" + id];
                dtBooks.Rows.Add(row);
            }
        }
        GridView1.DataSource = dtBooks;
        GridView1.DataBind();
    }
    else
    { 
    }
}

,但我没有得到GridView表在第二页。如果有人注意到我的错误并指出来,我将不胜感激。希望你能帮助我。

如何使用GridView中选定的行作为另一个页面中GridView的源

这是在重定向之前设置会话变量时常见的问题。我认为你可以通过使用重载的Response.Redirect方法来解决这个问题:

Response.Redirect("...", false); // false = don't stop execution

查看更多细节:
响应后会话变量丢失。重定向

另一种选择是将id存储在隐藏字段中,并使用Page.PreviousPage访问它们,如下所示:

HiddenField hidden = (HiddenField)Page.PreviousPage.FindControl("MyHiddenField");    
string values = hidden.Value; 

最后,根据页面正在做什么,您可能希望在这里使用Server.Transfer。这种方法有缺点,但在某些情况下是适用的。

在第二页中,您在向dtBooks添加一行之前检查查询字符串变量:

if (Request.QueryString["bookID" + id] != null)

但是,当您重定向时,您不会传递任何查询字符串:

Response.Redirect("SecondPage.aspx");

在猜测,我会认为你最初尝试使用查询字符串传递id,在更改到会话之前,你还没有更新所有的代码。

我有点担心你的第一页代码,虽然。你知道你会重定向到第二页,只要有回帖发生?这意味着无论你在第一页上有什么按钮/控件,如果他们因为任何原因返回,你将重定向到第二页。

编辑后注释

如果你不使用查询字符串,那么不要使用查询字符串:

foreach (int id in list)
{
    DataRow row;
    row = dtBooks.NewRow();
    row["ID"] = id;
    dtBooks.Rows.Add(row);
}