Как я могу использовать выбранные строки в GridView в качестве источника для GridView на другой странице? - PullRequest
0 голосов
/ 29 сентября 2011

Я пишу веб-сайт в Visual Studio, что-то вроде онлайн-библиотеки. У меня есть GridView на первой странице, которая представляет все книги, доступные из источника данных, и некоторые другие свойства, также содержащиеся в источнике данных. GridView содержит флажки, и пользователь может выбрать, какие книги он хочет заказать, установив флажок. У меня вопрос: как я могу использовать данные в выбранных строках, список книг с их свойствами и показать этот список на другой странице, чтобы пользователь мог узнать, какие элементы он выбрал?

Я пытался использовать цикл for на FirstPage:

   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 на второй странице. Буду очень признателен, если кто-нибудь заметит мою ошибку и укажет на нее. Надеюсь, ты сможешь мне помочь.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2011

На второй странице вы проверяете переменную строки запроса перед добавлением строки в dtBooks:

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

Однако вы не передаете никаких строк запроса при перенаправлении:

Response.Redirect("SecondPage.aspx");

Я бы подумал, что вы изначально пытались использовать строку запроса для передачи идентификаторов, прежде чем перейти к сеансу, и вы не обновили весь свой код.

Я немного обеспокоен кодом вашей первой страницы. Вы понимаете, что будете перенаправлять на вторую страницу всякий раз, когда появляется сообщение? Это означает, что независимо от того, какие кнопки / элементы управления у вас есть на первой странице, если они отправляют обратно по какой-либо причине, вы будете перенаправлены на вторую страницу.

РЕДАКТИРОВАТЬ ПОСЛЕ КОММЕНТАРИЙ

Если вы не используете строку запроса, не используйте строку запроса:

foreach (int id in list)
{
    DataRow row;
    row = dtBooks.NewRow();
    row["ID"] = id;
    dtBooks.Rows.Add(row);
}   
0 голосов
/ 29 сентября 2011

Это распространенная проблема при установке переменных сеанса перед перенаправлением.Я думаю, что вы можете обойти это, используя перегруженный Response.Redirect метод:

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

Смотрите здесь для более подробной информации: Переменные сеанса теряются после Response.Redirect

Другой вариант - сохранить идентификаторы в скрытом поле и получить к ним доступ с помощью Page.PreviousPage, например:

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

Наконец, в зависимости от того, что делает страница, вы можете использовать Server.Transfer здесь.У этого подхода есть недостатки, но в некоторых случаях он применим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...