2014-01-02 4 views
0

У меня есть страница с gridview на ней и выпадающий список, который определяет, сколько элементов на странице отобразит gridview.asp.net dropdownlist не обновляет выбранное значение

Значение pageSize gridview контролируется этим выпадающим списком и сохраняется в файле cookie. Когда пользователь загружает сайт, cookie считывается, чтобы он запоминал, какой размер страницы выбрал пользователь.

У меня есть одна проблема, и, если я выберу другое значение в раскрывающемся списке, он не обновит ни cookie, ни раскрывающийся список. Он возвращается к сохраненному значению.

Это выпадающий список созданный в GridView шаблона пейджера:

<PagerTemplate> 
      <asp:Table ID="Table3" runat="server" Width="100%"> 
       <asp:TableRow> 
        <asp:TableCell HorizontalAlign="Left"> 
         <asp:PlaceHolder ID="ph" runat="server"></asp:PlaceHolder> 
        </asp:TableCell> 
        <asp:TableCell HorizontalAlign="Right" Width="10%"> 
         Page Size 
          <asp:DropDownList runat="server" ID="ddlPageSize" AutoPostBack="true" 
           OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged" OnLoad="ddlPageSize_Load"> 
           <asp:ListItem>5</asp:ListItem> 
           <asp:ListItem>10</asp:ListItem> 
           <asp:ListItem>20</asp:ListItem> 
           <asp:ListItem>50</asp:ListItem> 
           <asp:ListItem>100</asp:ListItem> 
          </asp:DropDownList> 
        </asp:TableCell> 
       </asp:TableRow> 
      </asp:Table> 
     </PagerTemplate> 

и это, где я пытаюсь загрузить значение списка из печенья:

protected void Page_Load(object sender, EventArgs e) 
     { 
      string pageSize = "10"; 
      //Try and load the PageSize cookie from the user's machine and default to 10 records if none is found. 
      if (Request.Cookies["PageSize"] != null) 
      {     
       if (Request.Cookies["PageSize"]["Value"] != null) 
       { 
        pageSize = Request.Cookies["PageSize"]["Value"]; 
        int _pageSize; 
        int.TryParse(pageSize, out _pageSize); 
        gvRecordsList.PageSize = _pageSize; 
        DropDownList ddlPageSize = (gvRecordsList.BottomPagerRow).FindControl("ddlPageSize") as DropDownList; 
        ddlPageSize.SelectedIndex = ddlPageSize.Items.IndexOf(new ListItem(pageSize)); 
       } 
      } 
      else 
       gvRecordsList.PageSize = 10; 


      if (IsPostBack) 
      { 
       ApplyPaging();    
      } 
      else 
      { 
       gvRecordsList.DataSourceID = "RecordsListSqlDataSource"; 
       gvRecordsList.DataBind(); 
      } 
     } 

В выпадающий список индекс изменен код:

protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      DropDownList ddlPageSize = (gvRecordsList.BottomPagerRow).FindControl("ddlPageSize") as DropDownList; 
      gvRecordsList.PageSize = int.Parse(ddlPageSize.SelectedValue); 
      Response.Cookies["PageSize"]["Value"] = ddlPageSize.SelectedValue; 
      Response.Cookies["PageSize"].Expires = DateTime.Now.AddDays(1d); 
     } 

Когда я перехожу через код SelectedIndexCha Я вижу, что ddlPageSize.SelectedValue всегда содержит значение из файла cookie, 50, хотя я выбираю другое значение.

Я думаю, вопрос в том, где я могу установить индекс выпадающего списка?

DropDownList ddlPageSize = (gvRecordsList.BottomPagerRow).FindControl("ddlPageSize") as DropDownList; 
         ddlPageSize.SelectedIndex = ddlPageSize.Items.IndexOf(new ListItem(pageSize)); 

ответ

0

Page_Load событие выполняется перед DropDownListSelectedIndexChanged события. И вы загружаете значение файла cookie на DropDownList на событие PageLoad.

Я предлагаю вам попробовать загрузить файл cookie, например, на мероприятие OnPreRender.

Или добавить условие к вашей Page_Load логике проверки, если PostBack будет вызвано DropDownList:

DropDownList ddlPageSize = (gvRecordsList.BottomPagerRow).FindControl("ddlPageSize") as DropDownList;  
bool isDDLPostingBack = Request["__EVENTTARGET"] == ddlPageSize.UniqueID; 

if (Request.Cookies["PageSize"]["Value"] != null && !isDDLPostingBack) 
{ 
... 
} 
+0

Если я устанавливаю чтение куки в Page_PreRenderComplete я могу почти заставить его работать, за исключением того, я должен изменить выпадающий список дважды для изменения значения. Кажется, что когда он читает cookie, он находит две копии страницы, и я также вижу, что внутри папки Cookies каждый создается каждый новый. Это не так. –

+0

@sd_dracula: Вы пытались изменить логику Page_Load? –

Смежные вопросы