Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将GridView中的选定行用作另一页面中GridView的源?_C#_.net_Asp.net_Visual Studio_Visual Studio 2010 - Fatal编程技术网

C# 如何将GridView中的选定行用作另一页面中GridView的源?

C# 如何将GridView中的选定行用作另一页面中GridView的源?,c#,.net,asp.net,visual-studio,visual-studio-2010,C#,.net,Asp.net,Visual Studio,Visual Studio 2010,我正在VisualStudio中编写一个网站,类似于一个在线库。我在第一页有一个GridView,它显示了数据源中提供的所有书籍以及数据源中还包含的一些其他属性。GridView包含复选框,用户可以通过复选框选择要订购的书籍。我的问题是如何使用所选行中的数据、书籍列表及其属性,并在另一个页面上显示该列表,以便用户能够知道他选择了哪些项目 我尝试在第一页上使用for循环: protected void Page_Load(object sender, EventArgs e) {

我正在VisualStudio中编写一个网站,类似于一个在线库。我在第一页有一个GridView,它显示了数据源中提供的所有书籍以及数据源中还包含的一些其他属性。GridView包含复选框,用户可以通过复选框选择要订购的书籍。我的问题是如何使用所选行中的数据、书籍列表及其属性,并在另一个页面上显示该列表,以便用户能够知道他选择了哪些项目

我尝试在第一页上使用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"); 
         }
    }
受保护的无效页面加载(对象发送方,事件参数e)
{
列表ID=新列表();
如果(!IsPostBack)
{
}
其他的
{
对于(int i=0;i
在第二页:

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
    { 
    }
}
受保护的无效页面加载(对象发送方,事件参数e)
{
DataTable dtBooks=新数据表(“书籍”);
添加(新的数据列(“ID”,typeof(int));
如果(!IsPostBack)
{
变量列表=(列表)会话[“id”];
foreach(列表中的int-id)
{
if(Request.QueryString[“bookID”+id]!=null)
{
数据行;
row=dtBooks.NewRow();
行[“ID”]=请求.查询字符串[“bookID”+ID];
dtBooks.Rows.Add(row);
}
}
GridView1.DataSource=dtBooks;
GridView1.DataBind();
}
其他的
{ 
}
}

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

在重定向之前设置会话变量时,这是一个常见问题。我认为您可以通过使用重载的
响应来解决此问题。重定向
方法:

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);
}   

它仍然是一样的。。。你还有其他的建议吗?提前谢谢。但是我只需要在HiddenField中存储选中的行。我应该如何创建HiddenField?谢谢你的提示,我在第一页上更改了代码,添加了一个按钮以重定向到第二页。但是,我仍然无法在第二页上获取所选项目的信息。如果你有任何建议,我将非常感激。关于您的第一个注释,我这样做是因为否则我会得到一个错误“无法将列'ID'设置为null。请改用DBNull。”。