在基于Ajax搜索的Webcontrol上实现分页功能

时间:2011-03-01 09:16:44

标签: c# asp.net ajax paging

我目前正在使用UpdatePanel和updatemode条件构建搜索功能。此updatepanel的触发器是我的searchPhrase TextBox。当TextChanged触发时,我的面板会更新并显示正确的搜索结果。 然而,我对如何实现可与我的搜索结果一起使用的分页功能毫无头绪。 我希望分页链接显示在部分页面更新上,我希望寻呼机也更新我的searchResults(只想在一个页面上显示3个结果)。 如何正确设置?

这是我的代码(ascx)

<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
</asp:ScriptManagerProxy>

<div class="searchBox">
     <asp:TextBox ID="searchPhrase" runat="server"
     AutoCompleteType="Search"
     AutoPostBack="true" />
 </div>
      <asp:UpdatePanel ID="ProductenUpdate" runat="server" UpdateMode="Conditional">    
 <ContentTemplate>                   
     <asp:Repeater ID="ProductRepeater" runat="server">
         <ItemTemplate>
             <strong><sc:Text ID="Titel" Field="Titel"
            runat="server" /></strong><br />
             <sc:Text ID="Auteur" Field="Auteur" runat="server" />
             <sc:Text ID="Intro" Field="Intro" runat="server" />
             <sc:Image ID="Thumb" Field="Thumbnail" runat="server" /><br/>
         </ItemTemplate>
     </asp:Repeater>

     <div class="filterBox">
         <asp:PlaceHolder ID="filterOnePlaceholder"
             runat="server">
             <sc:Text ID="TitelOne" Field="Filter1" runat="server" />
             <asp:CheckBoxList ID="filterOneCbl" runat="server"
                 AutoPostBack="true"
                 CssClass="checkboxList">
             </asp:CheckBoxList>
         </asp:PlaceHolder>
     </div>

     <div class="filterBox">
         <asp:PlaceHolder ID="filterTwoPlaceholder"
             runat="server">
             <sc:Text ID="TitelTwo" Field="Filter2" runat="server" />
             <asp:CheckBoxList ID="filterTwoCbl" runat="server"
                AutoPostBack="true"
 CssClass="checkboxList"
 RepeatColumns="3"
 RepeatDirection="Vertical"> 

             </asp:CheckBoxList>
         </asp:PlaceHolder>
     </div>
     <div>
         PaginaMarker DIV:
         <asp:Label ID="paginaMarker" runat="server" />
     </div>

     <script type="text/javascript">
         function ClientCallbackFunction(args)
         {

         }
     </script> 


     <asp:Button ID="btnBackwards" Text="Vorige"
OnClick="MyServerCall(this.value)" />
     <asp:Button ID="btnForward" Text="Volgende"
OnClick="MyServerCall(this.value)" />



     <asp:DropDownList ID="DropDownListChoice" runat="server"
onChange="MyServerCall(this.value)">
         <asp:ListItem>Choice 1</asp:ListItem>
         <asp:ListItem>Choice 2</asp:ListItem>
         <asp:ListItem>Choice 3</asp:ListItem>
         <asp:ListItem>Choice 4</asp:ListItem>             
     </asp:DropDownList>
 </ContentTemplate>
 <Triggers>
     <asp:AsyncPostBackTrigger ControlID="searchPhrase"
EventName="TextChanged" />
 </Triggers> </asp:UpdatePanel>
代码背后的代码:

// Needed to store the searchResults
     List<Item> validSearchResults = new List<Item>();

     private List<string> listOneSelectedItems = new List<string>();
     private List<string> listTwoSelectedItems = new List<string>();

     private string currentCategoryPath = string.Empty;

     private string _callbackArgs;


     /// <summary>
     /// Raises the <see cref="E:System.Web.UI.Control.Init"/> event.
     /// </summary>
     /// <param name="e">An <see cref="T:System.EventArgs"/> object that contains the event data.</param>
     protected override void OnInit(EventArgs e)
     {
         base.OnInit(e);

         this.UpdateSelectedItemLists();
         this.currentCategoryPath = Sitecore.Context.Item.Paths.FullPath;

         this.searchPhrase.TextChanged += new EventHandler(searchPhrase_TextChanged);

         this.filterOneCbl.SelectedIndexChanged += new EventHandler(filterOneCbl_SelectedIndexChanged);
         this.filterTwoCbl.SelectedIndexChanged += new EventHandler(filterTwoCbl_SelectedIndexChanged);
         this.ProductRepeater.ItemDataBound += new RepeaterItemEventHandler(ProductRepeater_ItemDataBound);
     }


     private void UpdateScreen()
     {
         // update the list of selectedItems for use with the selection of new Items from the index
         this.UpdateSelectedItemLists();
         this.GetSearchResults();

         ProductRepeater.DataSource = validSearchResults;
         ProductRepeater.DataBind();

         ProductenUpdate.Update();
     }

     void btnSearch_Click(object sender, EventArgs e)
     {
         // update the list of selectedItems for use with the selection of new Items from the index
         this.UpdateSelectedItemLists();
         this.GetSearchResults();

         ProductRepeater.DataSource = validSearchResults;
         ProductRepeater.DataBind();

         ProductenUpdate.Update();
     }

     private void ProductRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
     {
         Item dataItem = (Item)e.Item.DataItem;

         // if there is a dataItem
         if (dataItem != null)
         {
             if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.Item)
             {
                 Sitecore.Web.UI.WebControls.Text Titel = (Sitecore.Web.UI.WebControls.Text)e.Item.FindControl("Titel");
                 Sitecore.Web.UI.WebControls.Text Auteur =  (Sitecore.Web.UI.WebControls.Text)e.Item.FindControl("Auteur");
                 Sitecore.Web.UI.WebControls.Text Intro = (Sitecore.Web.UI.WebControls.Text)e.Item.FindControl("Intro");
                 Sitecore.Web.UI.WebControls.Image Thumb = (Sitecore.Web.UI.WebControls.Image)e.Item.FindControl("Thumb");

                 if (Thumb != null)
                 {
                     Thumb.Item = dataItem;
                 }

                 if (Titel != null)
                 {
                     Titel.Item = dataItem;
                 }

                 if (Auteur != null)
                 {
                     Auteur.Item = dataItem;
                 }

                 if (Intro != null)
                 {
                     Intro.Item = dataItem;
                 }
             }
         }            
     }

     /// <summary>
     /// Handles the TextChanged event of the searchPhrase control.
     /// </summary>
     /// <param name="sender">The source of the event.</param>
     /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
     private void searchPhrase_TextChanged(object sender, EventArgs e)
     {
         this.UpdateScreen();
     }

     /// <summary>
     /// Handles the SelectedIndexChanged event of the filterTwoCbl control.
     /// </summary>
     /// <param name="sender">The source of the event.</param>
     /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
     private void filterTwoCbl_SelectedIndexChanged(object sender, EventArgs e)
     {
         this.UpdateScreen();
     }

     /// <summary>
     /// Handles the SelectedIndexChanged event of the filterOneCbl control.
     /// </summary>
     /// <param name="sender">The source of the event.</param>
     /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
     private void filterOneCbl_SelectedIndexChanged(object sender, EventArgs e)
     {
         this.UpdateScreen();
     }

     /// <summary>
     /// Updates the selected item lists.
     /// </summary>
     private void UpdateSelectedItemLists()
     {
         foreach (ListItem thisItem in filterOneCbl.Items)
         {
             if (thisItem.Selected)
             {
                 if (!listOneSelectedItems.Contains(thisItem.Value.ToUpper()))
                 {
                     listOneSelectedItems.Add(thisItem.Value.ToUpper());
                 }
             }
         }

         foreach (ListItem thisItem in filterTwoCbl.Items)
         {
             if (thisItem.Selected)
             {
                 if (!listTwoSelectedItems.Contains(thisItem.Value.ToUpper()))
                 {
                     listTwoSelectedItems.Add(thisItem.Value.ToUpper());
                 }
             }
         }
     }

     /// <summary>
     /// Gets the search results.
     /// </summary>
     private void GetSearchResults()
     {
         SearchResultRetreiver retriever = new SearchResultRetreiver("productenSearch");
         IndexSearcher searcher = null;

         Hits mySearchResults = retriever.GetSearchResults(searchPhrase.Text.Trim(), ref searcher);

         if (mySearchResults != null)
         {
             for (int i = 0; i < mySearchResults.Length(); i++)
             {
                 Item newItem = Sitecore.Data.Indexing.Index.GetItem(mySearchResults.Doc(i),  Sitecore.Context.Database);
                 string itemTitel = SitecoreHelper.ShowItemTitel(newItem);
                 bool addItem = true;
                 if (itemTitel.StartsWith("$")) addItem = false;
                 if (itemTitel.StartsWith("_")) addItem = false;

                 if (addItem)
                 {
                     this.validSearchResults.Add(newItem);
                 }
             }
         }
     }

     private void FilterSearchResults()
     {

     }

     /// <summary>
     /// Handles the Load event of the Page control.
     /// </summary>
     /// <param name="sender">The source of the event.</param>
     /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
     protected void Page_Load(object sender, EventArgs e)
     {
         Item contextItem = Sitecore.Context.Item;
         Item subwebsiteItem = contextItem.Axes.GetAncestors().Where(c => c.Axes.Level == 4).FirstOrDefault<Item>();

         Sitecore.Data.Fields.CheckboxField filterOneSelected = subwebsiteItem.Fields["Filter1Actief"];
         Sitecore.Data.Fields.CheckboxField filterTwoSelected = subwebsiteItem.Fields["Filter2Actief"];

         if (filterOneSelected.Checked)
         {
             TitelTwo.Item = subwebsiteItem;
         }

         if (filterTwoSelected.Checked)
         {
             TitelOne.Item = subwebsiteItem;
         }

         if (!Page.IsPostBack)
         {
             string callbackRef = Page.ClientScript.GetCallbackEventReference(this, "args", "ClientCallbackFunction", "");

             string callbackScript = "function MyServerCall(args)" +
                 "{" + callbackRef + "}";

             Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "MyServerCall", callbackScript, true);

             filterOnePlaceholder.Visible = false;
             filterTwoPlaceholder.Visible = false;

             if (subwebsiteItem != null)
             {                   
                 if (filterOneSelected.Checked)
                 {
                     filterOnePlaceholder.Visible = true;  

                     Item filterOneLocation =  Sitecore.Context.Database.GetItem(subwebsiteItem.Paths.FullPath + "/Filters/Filter1");
                     List<Item> filterOneList = new List<Item>();

                     filterOneList = filterOneLocation.GetChildren().Where(c => c.TemplateName.ToLower() == "filter").ToList<Item>();

                     foreach (Item filterItem in filterOneList)
                     {
                         ListItem thisItem = new ListItem(filterItem["Naam"], filterItem.ID.ToGuid().ToString());
                         this.filterOneCbl.Items.Add(thisItem);
                     }
                 }

                 if (filterTwoSelected.Checked)
                 {
                     filterTwoPlaceholder.Visible = true;

                     Item filterTwoLocation = Sitecore.Context.Database.GetItem(subwebsiteItem.Paths.FullPath + "/Filters/Filter2");
                     List<Item> filterTwoList = new List<Item>();

                     filterTwoList = filterTwoLocation.GetChildren().Where(c => c.TemplateName.ToLower() == "filter").ToList<Item>();

                     foreach (Item filterItem in filterTwoList)
                     {
                         ListItem thisItem = new ListItem(filterItem["Naam"], filterItem.ID.ToGuid().ToString());
                         this.filterTwoCbl.Items.Add(thisItem);
                     }
                 }
             }
         }           
     }

     #region ICallbackEventHandler Members

     /// <summary>
     /// Returns the results of a callback event that targets a control.
     /// </summary>
     /// <returns>The result of the callback.</returns>
     public string GetCallbackResult()
     {
         return this._callbackArgs;
     }

     /// <summary>
     /// Processes a callback event that targets a control.
     /// </summary>
     /// <param name="eventArgument">A string that represents an event argument to pass to the event handler.</param>
     public void RaiseCallbackEvent(string eventArgument)
     {
         this._callbackArgs = eventArgument;
     }

请看一下,告诉我如何让寻呼机为我的解决方案工作。

1 个答案:

答案 0 :(得分:0)

我通过引入一个GetList()方法和一个在彼此之后调用的Update()方法来解决这个问题。在de GetList()方法中,我设置了项目的总量,然后在Update方法中,我将调用另一个创建寻呼机的方法。 这解决了我的问题。