在基于Ajax搜索的Web控件上实现分页功能
我目前正在使用带updatemode条件的UpdatePanel构建搜索功能。 这个updatepanel的触发器是我的searchPhrase TextBox。 当TextChanged触发时,我的面板得到更新并显示正确的搜索结果。 然而,我不知道如何实现分页功能,它可以处理我的搜索结果。 我希望在部分页面更新中显示分页链接,并且我希望分页器也更新我的searchResults(只想在一个页面上显示3个结果)。 我如何正确设置它?
这是我的代码(ascx)
    <div class="filterBox">
        <asp:PlaceHolder ID="filterOnePlaceholder"
RUNAT = “服务器”>
    <div class="filterBox">
        <asp:PlaceHolder ID="filterTwoPlaceholder"
runat =“server”> PaginaMarker DIV:
    <script type="text/javascript">
        function ClientCallbackFunction(args)
        {
        }
    </script> 
    <asp:Button ID="btnBackwards" Text="Vorige"
OnClick =“MyServerCall(this.value)”/>
    <asp:DropDownList ID="DropDownListChoice" runat="server"
  onChange =“MyServerCall(this.value)”>选择1选择2选择3选择4 
(CS)
//需要存储searchResults列表validSearchResults = new List();
    private List<string> listOneSelectedItems = new
名单(); 私人列表listTwoSelectedItems =新列表();
    private string currentCategoryPath = string.Empty;
    private string _callbackArgs;
    /// <summary>
    /// Raises the <see cref="E:System.Web.UI.Control.Init"/>
事件。 /// ///包含事件数据的对象。 protected override void OnInit(EventArgs e){base.OnInit(e);
        this.UpdateSelectedItemLists();
        this.currentCategoryPath = Sitecore.Context.Item.Paths.FullPath;
        this.searchPhrase.TextChanged += new
事件处理程序(searchPhrase_TextChanged);
        this.filterOneCbl.SelectedIndexChanged
+ =新的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
从索引中选择新的项目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
从索引中选择新的项目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
包含事件数据。 private void searchPhrase_TextChanged(object sender,EventArgs e){this.UpdateScreen(); }
    /// <summary>
    /// Handles the SelectedIndexChanged event of the
filterTwoCbl控制。 /// ///事件的来源。 ///包含事件数据的实例。 private void filterTwoCbl_SelectedIndexChanged(object sender,EventArgs e){this.UpdateScreen(); }
    /// <summary>
    /// Handles the SelectedIndexChanged event of the
filterOneCbl控件。 /// ///事件的来源。 ///包含事件数据的实例。 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搜索器= null;
        Hits mySearchResults =  retriever.GetSearchResults(searchPhrase.Text.Trim(),
ref搜索者);
        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
包含事件数据。 protected void Page_Load(object sender,EventArgs e){Item contextItem = Sitecore.Context.Item; Item subwebsiteItem = contextItem.Axes.GetAncestors()。其中(c => c.Axes.Level == 4).FirstOrDefault();
        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”); 列表filterOneList = new List();
                    filterOneList = filterOneLocation.GetChildren().Where(c
=> c.TemplateName.ToLower()==“filter”)。ToList();
                    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 filterTwoList = new List();
                    filterTwoList = filterTwoLocation.GetChildren().Where(c
=> c.TemplateName.ToLower()==“filter”)。ToList();
                    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
表示传递给事件处理程序的事件参数。 public void RaiseCallbackEvent(string eventArgument){this._callbackArgs = eventArgument; }
请看一看,并告诉我如何让我的解决方案为寻呼机工作。
我通过引入一个GetList()方法和一个在彼此之后被调用的Update()方法来解决这个问题。 在de GetList()方法我会设置项目的总量,并在更新方法,然后我会调用另一个方法,将创建寻呼机。 这解决了我的问题。
链接地址: http://www.djcxy.com/p/7605.html上一篇: Implementing Paging functionaliteit on a Ajax search based Webcontrol
