+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / Paging mechanism in List control

Paging mechanism in List control

16 posts, 0 answered
  1. Jay Mehta
    Jay Mehta avatar
    28 posts
    Registered:
    30 Jun 2009
    18 Aug 2009
    Link to this post
    Hi,

    Is there a paging mechanism in the lists control.  I have more then 40 items in the lists module, want to break the display in pages, like 10 items per page..

    Thank you,
    Jay Mehta.
  2. Parvan
    Parvan avatar
    151 posts
    Registered:
    24 Sep 2012
    19 Aug 2009
    Link to this post
    Hello Jay Mehta,

    By default there is no paging mechanism in the List control.
    We can try to propose workaround. Can you tell us where do you want the pager - for example in the Simple List/Expanded List mode?

    Greetings,
    Parvan
    the Telerik team

    Instantly find answers to your questions on the newTelerik Support Portal.
    Check out the tipsfor optimizing your support resource searches.
  3. Jay Mehta
    Jay Mehta avatar
    28 posts
    Registered:
    30 Jun 2009
    19 Aug 2009
    Link to this post
    Hi Pravan,

    Thank you for your reply.
    We are using Simple List mode.

    Thank you,
    Jay Mehta.
  4. Parvan
    Parvan avatar
    151 posts
    Registered:
    24 Sep 2012
    20 Aug 2009
    Link to this post
    Hi Jay Mehta,

    It is possible to use the News module for this goal.

    Here is some guidance - in this forum post.

    I will also provide you with some code that can help you make paging for the list control, but it is too complex and you'd better use the approach with News module.
    Step to setup:
    1. Put the attached CustomListControl.cs file in your site App_Code folder

    2. You need to setup the external templates for the ListDisplay control and add these lines in the Telerik controls configuration file:
          <viewSettings hostType="Telerik.Lists.WebControls.CustomListControl"
              <additionalTemplates> 
                  <!--Simple list--> 
                  <add key="SimpleListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/SimpleListView.ascx" /> 
                  <!--Expanded list--> 
                  <add key="ExpandedListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/ExpandedListView.ascx" /> 
                  <!--Expandable list--> 
                  <add key="ExpandableListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/ExpandableListView.ascx" /> 
                  <!--Anchor list--> 
                  <add key="AnchorListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/AnchorListView.ascx" /> 
                  <!--Page list--> 
                  <add key="PageListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/PageListView.ascx" /> 
                  <!--Simple Rotating list--> 
                  <add key="RotatingListsSimpleTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/RotatingListsSimpleView.ascx" /> 
                  <!--Expanded Rotating list--> 
                  <add key="RotatingListsExpandedTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/RotatingListsExpandedView.ascx" /> 
              </additionalTemplates> 
          </viewSettings> 

    3. Add this line in the <toolbox> section of the web.config file:
    <toolboxControls> 
    ... 
    <add name="CustomListControl" section="Most popular" type="Telerik.Lists.WebControls.CustomListControl, App_Code" 
              description="List control with paging" /> 
               
    </toolboxControls> 


    I hope this helps you.

    Sincerely yours,
    Parvan
    the Telerik team

    Instantly find answers to your questions on the newTelerik Support Portal.
    Check out the tipsfor optimizing your support resource searches.
  5. Jay Mehta
    Jay Mehta avatar
    28 posts
    Registered:
    30 Jun 2009
    27 Aug 2009
    Link to this post
    Hi Pravan,

    Thank you for the idea.
    But I do not see any controls which you mentioned in the code below. Is there anything I have to find externally or upload? 
    I have lists folder on my machine ~\Sitefinity\Admin\ControlTemplates\Lists location. It only consists of 1 xml file.

    Thank you,
    Jay Mehta.
  6. Jay Mehta
    Jay Mehta avatar
    28 posts
    Registered:
    30 Jun 2009
    28 Aug 2009
    Link to this post
    Hi,

    And also, where I could find the "Telerik controls configuration file".

    Thank you,
    Jay Mehta.
  7. Jay Mehta
    Jay Mehta avatar
    28 posts
    Registered:
    30 Jun 2009
    28 Aug 2009
    Link to this post
    Hi Pravan,

    Thanks for the help, please ignore the previous questions, I got them figured out, from the other posts. 

    I tried using your code for the paging, I did select 10 in the ItemsPerPage, and also did select AllowPaging = true,  but it did not work,   was there any other property that I had to select.


    Thank you,
    Jay Mehta.
  8. Ivan Dimitrov
    Ivan Dimitrov avatar
    16072 posts
    Registered:
    25 Nov 2016
    28 Aug 2009
    Link to this post
    Hi Jay Mehta,

    I am not sure what exactly is not working form you, but I suggest modifying the code as below:

    using System; 
    using System.Collections; 
    using System.ComponentModel; 
    using Telerik.Cms.Web.UI; 
    using Telerik.Lists.WebControls; 
     
    namespace Telerik.Samples.WebControls 
     
        [ToolboxItem(typeof(CustomListControlToolboxItem))] 
        public class CustomListControl : ListDisplay 
        { 
            [Category("Paging")] 
            public virtual int ItemsPerPage 
            { 
                get 
                { 
                    object obj = ViewState["ItemsPerPage"]; 
                    if (obj != null
                        return (int)obj; 
                    return 10; 
                } 
                set 
                { 
                    if (value < 0) 
                        throw new ArgumentOutOfRangeException("value", String.Format("NegativeValueNotAllowed""ItemsPerPage")); 
                    ViewState["ItemsPerPage"] = value; 
                } 
            } 
     
            [Category("Paging")] 
            public virtual bool AllowPaging 
            { 
                get 
                { 
                    object obj = ViewState["AllowPaging"]; 
                    if (obj != null
                        return (bool)obj; 
                    return true
                } 
                set 
                { 
                    ViewState["AllowPaging"] = value; 
                } 
            } 
     
            public CustomListControl() 
            { 
     
            } 
     
            //ADD PAGER TO THE TEMPLATE 
            public override string SimpleListTemplatePath 
            { 
                get 
                { 
                    return "~/Sitefinity/ControlTemplates/Lists/SimpleListView.ascx"
                } 
     
            } 
     
            public override Type AssemblyInfo 
            { 
                get 
                { 
                    return typeof(ListDisplay); 
                } 
                set 
                { 
                    base.AssemblyInfo = value; 
                } 
            } 
            public override Type LocalizationAssemblyInfo 
            { 
                get 
                { 
                    return typeof(ListDisplay); 
                } 
                set 
                { 
                    base.LocalizationAssemblyInfo = value; 
                } 
            } 
     
            protected int CurrentPage 
            { 
                get 
                { 
                    object o = this.ViewState["_CurrentPage"]; 
                    if (o == null
                        return 1; 
                    else 
                        return (int)o; 
                } 
                set 
                { 
                    this.ViewState["_CurrentPage"] = value; 
                } 
            } 
     
            void Pager_SelectedPageChanged(object sender, EventArgs e) 
            { 
                this.CurrentPage = ((Pager)sender).SelectedPage; 
                this.ChildControlsCreated = false
            } 
     
            protected override void CreateChildControls() 
            { 
                if (this.AllowPaging && base.ListsIds != null
                { 
     
                    Pager pager = base.SimpleListContainer.GetControl<Pager>("pager1"false); 
                    if (pager != null
                    { 
                        IList dataSource = null
     
                        if (base.ListsIds != null
                            dataSource = this.Manager.GetListsByIds(base.ListsIds); 
                            
     
     
                        int numberOfPages = dataSource.Count / this.ItemsPerPage; 
                        if (dataSource.Count % this.ItemsPerPage > 0) 
                        { 
                            numberOfPages++; 
                        } 
                        pager.SelectedPageChanged += new EventHandler<EventArgs>(Pager_SelectedPageChanged); 
                        pager.PageCount = numberOfPages; 
                        pager.SelectedPage = this.CurrentPage; 
     
                         
                        this.CustomDataSource = this.Manager.GetLists(this.CurrentPage * this.ItemsPerPage - this.ItemsPerPage, this.ItemsPerPage); 
                         
                        
                    } 
                    base.CreateChildControls(); 
                } 
                else 
                { 
                    base.CreateChildControls(); 
                } 
            } 
        } 

    Here is the page you should also add.

    <telerik:Pager ID="pager1" runat="server"
        <LayoutTemplate> 
            <asp:Repeater ID="PageRepeaterLinkButton" runat="server"
                <HeaderTemplate> 
                    <ol class="sf_pager"
                    <li><asp:LinkButton ID="PreviousPage" runat="server" Text="PreviousPage"></asp:LinkButton></li
                </HeaderTemplate> 
                <ItemTemplate> 
                    <li> 
                        <asp:LinkButton ID="SingleItem" runat="server" /> 
                    </li> 
                </ItemTemplate> 
                <FooterTemplate> 
                    <li><asp:LinkButton ID="NextPage" runat="server" Text="NextPage"></asp:LinkButton></li
                    </ol> 
                </FooterTemplate> 
            </asp:Repeater> 
            <asp:Repeater ID="PageRepeaterHyperLink" runat="server"
                <HeaderTemplate> 
                    <ol class="sf_pager"
                    <li><asp:HyperLink ID="PreviousPage" runat="server" Text="PreviousPage"></asp:HyperLink></li
                </HeaderTemplate> 
                <ItemTemplate> 
                    <li> 
                        <asp:HyperLink ID="SingleItem" runat="server" /> 
                    </li> 
                </ItemTemplate> 
                <FooterTemplate> 
                    <li><asp:HyperLink ID="NextPage" runat="server" Text="NextPage"></asp:HyperLink></li
                    </ol> 
                </FooterTemplate> 
            </asp:Repeater> 
        </LayoutTemplate> 
    </telerik:Pager> 
     
     


    Sincerely yours,
    Ivan Dimitrov
    the Telerik team

    Instantly find answers to your questions on the new Telerik Support Portal.
    Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
  9. Jay Mehta
    Jay Mehta avatar
    28 posts
    Registered:
    30 Jun 2009
    28 Aug 2009
    Link to this post
    Hi Pravan,

    Thanks for the reply, I did make the code change, but was not exactly sure about where to add that page. Does that go inside the control file?


    Thank you,
    Jay Mehta.
  10. Ivan Dimitrov
    Ivan Dimitrov avatar
    16072 posts
    Registered:
    25 Nov 2016
    30 Aug 2009
    Link to this post
    Hello Jay Mehta,

    It was Ivan. You should add the pager in your template(SimpleListView.ascx). The control should have ID="pager1" otherwise the if close in CreateChildControls willnot be executed. There we are sgetting the control and using it in our logic.

    Regards,
    Ivan Dimitrov
    the Telerik team

    Instantly find answers to your questions on the new Telerik Support Portal.
    Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
  11. Gary Weinstein
    Gary Weinstein avatar
    3 posts
    Registered:
    03 Apr 2006
    16 Feb 2011
    Link to this post
    Hi Ivan,

    I have followed this posting (and many, many more in the recent days...), trying to implement a paging list control myself. Using Sitefinity 3.7 SP4, I have attempted to follow the directions you gave here, but something is apprently wrong with my code since I get the whole list and don't get the paging (set at the administration level).
    I'd appreciate it if you could point me to my mistake - your assistance will be highly appreciated!

    Thanks in advence,

    Gary.

    P.S. - I have created a sandbox for testing sitefinity 4.0 and telerik hasn't implemented paging lists in it as well. Why?

    My code follows:

    SimpleListView.aspx (located at: ~/Sitefinity/ControlTemplates/Lists/SimpleListView.ascx):
    <%@ Control Language="C#" %>
    <%@ Register Assembly="Telerik.Cms.Web.UI" Namespace="Telerik.Cms.Web.UI" TagPrefix="sfWeb" %>
    <%@ Register Assembly="Telerik.Cms.Engine" Namespace="Telerik.Cms.Engine.WebControls"
        TagPrefix="sfWeb" %>
    <%--<telerik:CssFileLink ID="CssFileLink1" EmbeddedFileName="Telerik.Lists.Resources.ControlTemplates.Frontend.listsCommonLayout.css"
        FileName="" Media="screen" runat="server" />--%>
    <asp:Repeater ID="lists" runat="server">
        <ItemTemplate>
            <h2 class="sf_listTitle">
                <asp:Literal ID="listTitle" runat="server" /></h2>
            <asp:Repeater ID="listItems" runat="server">
                <HeaderTemplate>
                    <%--<ul class="sf_simpleList">--%>
                    <p class="sf_simpleList">
                </HeaderTemplate>
                <ItemTemplate>
                    <%--<li> --%>
                        <asp:Literal ID="Test" runat="server" />
                        <b><asp:Literal ID="headline" runat="server" /></b><br />
                        <asp:Literal ID="content" runat="server" />
                        <br />
                    <%-- </li>--%>
                </ItemTemplate>
                <FooterTemplate>
                    <%--</ul>--%>
                </FooterTemplate>
            </asp:Repeater>
        </ItemTemplate>
    </asp:Repeater>
    <sfWeb:Pager ID="pager1" runat="server">
        <LayoutTemplate>
            <asp:Repeater ID="PageRepeaterLinkButton" runat="server">
                <HeaderTemplate>
                    <ol class="sf_pager">
                        <li>
                            <asp:LinkButton ID="PreviousPage" runat="server" Text="PreviousPage"></asp:LinkButton></li>
                </HeaderTemplate>
                <ItemTemplate>
                    <li>
                        <asp:LinkButton ID="SingleItem" runat="server" />
                    </li>
                </ItemTemplate>
                <FooterTemplate>
                    <li>
                        <asp:LinkButton ID="NextPage" runat="server" Text="NextPage"></asp:LinkButton></li>
                    </ol>
                </FooterTemplate>
            </asp:Repeater>
            <asp:Repeater ID="PageRepeaterHyperLink" runat="server">
                <HeaderTemplate>
                    <ol class="sf_pager">
                        <li>
                            <asp:HyperLink ID="PreviousPage" runat="server" Text="PreviousPage"></asp:HyperLink></li>
                </HeaderTemplate>
                <ItemTemplate>
                    <li>
                        <asp:HyperLink ID="SingleItem" runat="server" />
                    </li>
                </ItemTemplate>
                <FooterTemplate>
                    <li>
                        <asp:HyperLink ID="NextPage" runat="server" Text="NextPage"></asp:HyperLink></li>
                    </ol>
                </FooterTemplate>
            </asp:Repeater>
        </LayoutTemplate>
    </sfWeb:Pager>

    App_Code/CustomListControl.cs
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Web.UI;
    using Telerik.Cms.Web.UI;
    using Telerik.Lists.WebControls;
     
    namespace Telerik.Lists.WebControls
    {
     
        [ToolboxItem(typeof(CustomListControl))]
        public class CustomListControl : ListDisplay
        {
            [Category("Paging")]
            public virtual int ItemsPerPage
            {
                get
                {
                    object obj = ViewState["ItemsPerPage"];
                    if (obj != null)
                        return (int)obj;
                    return 10;
                }
                set
                {
                    if (value < 0)
                        throw new ArgumentOutOfRangeException("value", String.Format("NegativeValueNotAllowed", "ItemsPerPage"));
                    ViewState["ItemsPerPage"] = value;
                }
            }
     
            [Category("Paging")]
            public virtual bool AllowPaging
            {
                get
                {
                    object obj = ViewState["AllowPaging"];
                    if (obj != null)
                        return (bool)obj;
                    return true;
                }
                set
                {
                    ViewState["AllowPaging"] = value;
                }
            }
     
            public CustomListControl()
            {
     
            }
     
            //ADD PAGER TO THE TEMPLATE
            public override string SimpleListTemplatePath
            {
                get
                {
                    return "~/Sitefinity/ControlTemplates/Lists/SimpleListView.ascx";
                }
     
            }
     
            public override Type AssemblyInfo
            {
                get
                {
                    return typeof(ListDisplay);
                }
                set
                {
                    base.AssemblyInfo = value;
                }
            }
            public override Type LocalizationAssemblyInfo
            {
                get
                {
                    return typeof(ListDisplay);
                }
                set
                {
                    base.LocalizationAssemblyInfo = value;
                }
            }
     
            protected int CurrentPage
            {
                get
                {
                    object o = this.ViewState["_CurrentPage"];
                    if (o == null)
                        return 1;
                    else
                        return (int)o;
                }
                set
                {
                    this.ViewState["_CurrentPage"] = value;
                }
            }
     
            void Pager_SelectedPageChanged(object sender, EventArgs e)
            {
                this.CurrentPage = ((Pager)sender).SelectedPage;
                this.ChildControlsCreated = false;
            }
     
            protected override void CreateChildControls()
            {
     
                if (this.AllowPaging && base.ListsIds != null)
                {
                    Pager pager = base.SimpleListContainer.GetControl<Pager>("pager1", true);
     
                    //pager.PageCount = 2;
                    //pager.SelectedPage = 1;
                    if (pager != null)
                    {
                        IList dataSource = null;
     
                        if (base.ListsIds != null)
                            dataSource = this.Manager.GetListsByIds(base.ListsIds);
     
                        int numberOfPages = dataSource.Count / this.ItemsPerPage;
                        if (dataSource.Count % this.ItemsPerPage > 0)
                        {
                            numberOfPages++;
                        }
                        pager.SelectedPageChanged += new EventHandler<EventArgs>(Pager_SelectedPageChanged);
                        pager.PageCount = numberOfPages;
                        pager.SelectedPage = this.CurrentPage;
     
     
                        this.CustomDataSource = this.Manager.GetLists(this.CurrentPage * this.ItemsPerPage - this.ItemsPerPage, this.ItemsPerPage);
     
                    }
                    base.CreateChildControls();
                }
                else
                {
                    base.CreateChildControls();
                }
            }
        }
    }

    and finally: Telerik.Sitefinity.Configuration.ControlsConfig.xml
    <?xml version="1.0" encoding="utf-8"?>
    <controlsConfig>
      <viewMap>
        <viewSettings hostType="Telerik.News.WebControls.NewsView">
          <additionalTemplates>
            <!--Provides user interface for displaying a list of news items in the NewsView control for the News module.-->
            <add key="ItemListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/News/AMCListPageMaster.ascx" />
            <!--Provides user interface for displaying a single news item in the NewsView control of the News module.-->
            <add key="SingleItemTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/News/AMCListPageDetails.ascx" />
          </additionalTemplates>
        </viewSettings>
        <viewSettings hostType="Telerik.Cms.Engine.WebControls.Design.GenericContentDesigner"
            layoutTemplatePath="~/Sitefinity/Admin/ControlTemplates/Generic_Content/GenericContentDesigner.ascx" />
        <!-- AdRotator Delux Addition:
            <viewSettings hostType="Telerik.Cms.Engine.WebControls.Design.LibraryItemEdit"
                layoutTemplatePath="~/Sitefinity/UserControls/AdRotatorDelux/LibraryItemEdit.ascx" />
            -->
        <!--Provides user interface for editing a news item in the News module.-->
        <viewSettings hostType="Telerik.News.WebControls.Admin.NewsItemEdit" layoutTemplatePath="~/Sitefinity/Admin/ControlTemplates/News/NewsItemEdit.ascx" />
        <!--Provides user interface for adding new news items in the News module.-->
        <viewSettings hostType="Telerik.News.WebControls.Admin.NewsItemNew" layoutTemplatePath="~/Sitefinity/Admin/ControlTemplates/News/NewsItemNew.ascx" />
     
        <viewSettings hostType="Telerik.Lists.WebControls.ListDisplay">
          <additionalTemplates>
            <!--Simple list-->
            <add key="SimpleListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/SimpleListView.ascx" />
             
            <!--Expanded list--><!--
            <add key="ExpandedListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/ExpandedListView.ascx" />
            --><!--Expandable list--><!--
            <add key="ExpandableListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/ExpandableListView.ascx" />
            --><!--Anchor list--><!--
            <add key="AnchorListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/AnchorListView.ascx" />
            --><!--Page list--><!--
            <add key="PageListTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/PageListView.ascx" />
            --><!--Simple Rotating list--><!--
            <add key="RotatingListsSimpleTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/RotatingListsSimpleView.ascx" />
            --><!--Expanded Rotating list--><!--
            <add key="RotatingListsExpandedTemplatePath" layoutTemplatePath="~/Sitefinity/ControlTemplates/Lists/RotatingListsExpandedView.ascx" />-->
             
          </additionalTemplates>
        </viewSettings>
      </viewMap>
    </controlsConfig>
  12. Ivan Dimitrov
    Ivan Dimitrov avatar
    16072 posts
    Registered:
    25 Nov 2016
    17 Feb 2011
    Link to this post
    Hello Gary,

    We answered similar question in this post for Sitefinity 4.0 edition. Please take a look at it.

    Regards,
    Ivan Dimitrov
    the Telerik team
  13. Gary Weinstein
    Gary Weinstein avatar
    3 posts
    Registered:
    03 Apr 2006
    17 Feb 2011
    Link to this post
    Hi Ivan,

    Thanks for you quick reply. I had a look at the post you mentioned but couldn't understand the relevence to my problem. I have tried placing the pager control inside the <ItemTemplate> section of the repeater control but that doesn't work either (to be specific, the error I now get is: "

    A required control was not found in the template for "~/Sitefinity/ControlTemplates/Lists/SimpleListView.ascx". The control must be assignable form type "Telerik.Cms.Web.UI.Pager" and must have ID "pager1".").

    Could you please try and clarify this issue to me?

    Thanks again,

    Respectfully,

    Gary.
  14. Ivan Dimitrov
    Ivan Dimitrov avatar
    16072 posts
    Registered:
    25 Nov 2016
    04 Mar 2011
    Link to this post
    Hi Gary,

    This error is thrown, because you use SimpleListView public template and in this template you should have pager control with ID="pager1" the control is not in the template or inside the controls collection.

    Kind regards,
    Ivan Dimitrov
    the Telerik team
    Registration for Q1 2011 What’s New Webinar Week is now open. Mark your calendar for the week starting March 21st and book your seat for a walk through all the exciting stuff we ship with the new release!
  15. Gary Weinstein
    Gary Weinstein avatar
    3 posts
    Registered:
    03 Apr 2006
    05 Mar 2011
    Link to this post
    Hi Ivan,

    Thanks again for your reply.
    Apparently I am missing an essential piece of knowledge concerning working with templates in Sitefinity: To the best of my understanding, I have added a pager control to the file SimpleListView.ascx as listed above and gave it the ID "pager1" as required.
    And still I get the error about the pager control not being found.

    What am I doing wrong???
    Please be specific so that I can solve this issue once and for all and stop nagging you about it...

    Thanks,

    Gary.
  16. Ivan Dimitrov
    Ivan Dimitrov avatar
    16072 posts
    Registered:
    25 Nov 2016
    07 Mar 2011
    Link to this post
    Hello Gary,

    In this line  the control is requested from the template - you have set the control as required.

    Pager pager = base.SimpleListContainer.GetControl<Pager>("pager1", true);

    In the original sample the code is not required


                    Pager pager = base.SimpleListContainer.GetControl<Pager>("pager1"false);

    It is possible that in the current request the control is not added to the SimpleListContainer, but you are trying to get it. Try setting the second parameter to false. You can also expose a public virtual property of type Pager and get the control from it.

    Best wishes,
    Ivan Dimitrov
    the Telerik team
    Registration for Q1 2011 What’s New Webinar Week is now open. Mark your calendar for the week starting March 21st and book your seat for a walk through all the exciting stuff we ship with the new release!
Register for webinar
16 posts, 0 answered