【问题标题】:How can I use the selected rows in GridView as a source for a GridView in another page?如何将 GridView 中的选定行用作另一个页面中 GridView 的源?
【发布时间】:2011-09-28 20:02:05
【问题描述】:

我正在用 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"); 
         }
    }

在第二页上:

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 表。如果有人注意到我的错误并指出,我将不胜感激。希望你能帮助我。

【问题讨论】:

    标签: c# .net asp.net visual-studio visual-studio-2010


    【解决方案1】:

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

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

    更多详情请看这里:
    Session variables lost after Response.Redirect

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

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

    最后,根据页面的用途,您可能希望在此处使用Server.Transfer。这种方法有一些缺点,但在某些情况下它是适用的。

    【讨论】:

    • 还是一样...你还有其他建议吗?提前谢谢你。
    • 但我只需要在 HiddenField 中存储选中的行。我应该如何创建 HiddenField?
    【解决方案2】:

    在您的第二页中,您在向 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);
    }   
    

    【讨论】:

    • 感谢您的注意,我更改了第一页的代码,我添加了一个重定向到第二页的按钮。但是,我仍然没有在第二页上获得所选项目的信息。如果您有任何建议,我将不胜感激。关于您的第一个注释,我这样做是因为否则我会收到错误“无法将列 'ID' 设置为空。请改用 DBNull。”。
    猜你喜欢
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多