没有寻呼机的asp .net水平滚动

时间:2013-01-02 12:14:48

标签: c# asp.net

ASP.NET [Horizontal scroll fro GridView] 显示如何将水平滚动添加到我的网格

问题是它还会在自动生成的寻呼机上滚动。

我可以制作外部寻呼机,但肯定是更好的解决方案吗?

问题是:是否有一种简单的方法可以使我的gridview可以滚动而不会使寻呼机可滚动。

2 个答案:

答案 0 :(得分:2)

另一种解决方案更为简单:

  1. 创建一个空表并为其指定 id 。就我而言 customPager
  2. 为您的默认GridView寻呼机提供 css样式您只需要一个名称无css编码
  3. 在您的aspx(head section)中包含 jquery
  4. 您会看到以下两行脚本... 将默认分页移到您放置 customPager
  5. 的位置之外

    这是我能做的最简单的......希望它有帮助...

        <table id="customPager">
    
        </table>
        <hr />
            <div id="dvGridView" style="height: 200px;overflow:scroll;">
            <asp:GridView ID="GridView1" runat="server" AllowPaging="True" PageSize="5">
                <PagerSettings Position="Top" />
                <PagerStyle CssClass="pagerStyle" />
            </asp:GridView>
        </div>
        <script>
            $('#customPager').html($('.pagerStyle').html());
            $('.pagerStyle').html('');
        </script>
    

答案 1 :(得分:0)

erich007给出了一个非常有趣的答案,这可能是要走的路,但我没有时间去测试它。

以下方法对我有用:

报价:

http://blogs.visoftinc.com/2008/03/19/extending-the-gridview-to-work-with-the-new-datapager-control/

扩展GridView以使用新的DataPager控件

戴夫马里尼|发布时间:2008年3月19日 Technorati标签:ASP.NET,C#

最近,我阅读了Scott Mitchell关于.NET Framework 3.5版中包含的新ListView和DataPager控件的文章。这让我很好奇如何适应其他众所周知的数据绑定控件,如GridView,以便它们可以与DataPager控件一起工作。经过一些轻微的阅读和相当沉重的反映GridView控件的内容,我有一个游戏计划,并准备好了。扩展数据绑定控件以允许与DataPager控件进行通信并不困难,但它确实假设您已了解数据如何绑定到控件。但是当GridView内置了自己的分页控件时,为什么还要这么做呢?嗯,首先,能够将寻呼机与网格分离,这使我们可以做一些非常酷的事情。我能想到的一件事是在左侧栏中使用GridView,在主窗口中的某个位置使用分页控件。此外,我们可以有一个带有两个寻呼机的网格。无论我们使用哪一页来浏览我们的数据,每个页面都会始终跟踪当前页面。最后,与GridView本身相比,寻呼机的模板控件非常强大。

让我们从数据绑定控件如何与DataPager进行通信开始。 DataPager控件可以连接到任何实现位于System.Web.Extensions程序集中的IPageableItemContainer接口的控件。这里简要介绍了.NET Reflector提供的界面:

public interface IPageableItemContainer
{
    //Events
    event EventHandler<PageEventArgs> TotalRowCountAvailable;
    // Methods
    void SetPageProperties(int startRowIndex, int maximumRows, bool databind);
    // Properties
    int MaximumRows { get; }
    int StartRowIndex { get; }
}

接口的MaximumRows和StartRowIndex属性只是为数据绑定控件创建一种方法来确定要显示的数据窗口。这有效地定义了您将被视为&#34; Page&#34;数据的。 SetPageProperties方法在与DataPager的交互中很重要,因为这是控件中的方法,只要您单击任何DataPagerField控件(例如,下一个或上一个按钮),DataPager就会调用该方法。最后,接口定义了一个名为TotalRowCountAvailable的事件。此事件告诉DataPager绑定到控件的数据中有多少条记录。这显然很重要,因为DataPager使用总行数来确定如何呈现手册页按钮或是否禁用下一个或上一个按钮,以便您不会转到不存在的页面索引。

因此,让我们开始使用DataPager的钩子扩展GridView。根据GridView考虑IPageableItemContainer接口,我们意识到MaximumRows等效于现有的PageSize属性,StartRowIndex可以从现有的PageSize和PageIndex属性计算。我们还通过声明并创建相应的事件调用者来准备事件。由于我希望我的新分页功能成为此网格的默认功能,因此我强制寻呼机在每个页面加载时隐藏自己。如果您愿意,可以为此行为添加切换。最后,我们存根SetPageProperties方法,但我们暂时将其留空,因为我们很快就会重新访问它。到目前为止,我们的新GridView看起来像这样:

public class PageableGridView : GridView, IPageableItemContainer
{
     public PageableGridView() : base()
     {
          PagerSettings.Visible = false;
     }
     public event EventHandler<PageEventArgs> TotalRowCountAvailable;
     public int MaximumRows
     {
          get{ return this.PageSize; }
     }
     public int StartRowIndex
     {
          get{ return (this.PageSize * this.PageIndex); }
     }
     protected virtual void OnTotalRowCountAvailable(PageEventArgs e)
     {
          if (TotalRowCountAvailable != null)
                TotalRowCountAvailable(this, e);
     }
     protected virtual void SetPageProperties(int startRowIndex, int maximumRows, bool dataBind) { }
}

好消息是,我们已经超过了一半。现在是事情变得更复杂的地方。我们仍然需要一种方法来设置带有pagesize和起始行值的控件,这取决于DataPager在用户点击其中一个按钮后需要显示的内容。这是SetPageProperties方法发挥作用的地方。以下是完成工作的基本实现:

protected virtual void SetPageProperties(int startRowIndex,int maximumRows,bool dataBind) { if(数据绑定) {              PageSize = maximumRows;              int newPageIndex =(startRowIndex / PageSize);              if(PageIndex!= newPageIndex)              {                  OnPageIndexChanging(new GridViewPageEventArgs(newPageIndex));                  PageIndex = newPageIndex;                  OnPageIndexChanged(EventArgs.Empty);              } }         RequiresDataBinding = databind; } 当DataPager向网格发送其分页信息时,网格需要在其自身上设置任何适当的参数以准备绑定到正确的数据窗口。网格已经配备的2个属性是PageSize和PageIndex属性。这些属性可以从发送到方法的信息中计算出来,因此我们设置它们。当然,如果正在更改页面,我们应该触发OnPageIndexChanging事件。这意味着如果您没有绑定到数据源,您仍然需要确保处理此事件。最后,如果DataPager处于绑定数据的过程中,我们会指示网格重新绑定。这是一个基本实现,因此您也希望在此处执行任何数据完整性检查,例如检查以确保新的PageIndex和StartRowIndex值在有效范围内。

要完成GridView与DataPager的集成,还有一件事要做。为了让DataPager呈现适当数量的页面按钮,或者让它知道何时禁用寻呼机上的下一页或上一页页面按钮,它需要知道有多少总行数。这与在DataPager本身以声明方式指定的页面大小相结合,有助于确定数据源包含的页面数。问题是,寻呼机不知道这些信息。然而,GridView知道它,我们需要从那里获取它并将其传递给DataPager。但是什么时候能确定GridView有这些数据? GridView控件继承自CompositeDataboundControl。此类型包含CreateChildControls方法的特殊变体,该方法还接受一个属性,该属性指示控件是绑定到数据还是仅重新呈现。一点反映显示GridView使用此方法绑定到其数据源。知道了这一点,看来这是我们想要为引发的TotalRowCountAvailable事件注入触发器的地方。这有点复杂,因为我们需要处理我们手动绑定到数据源或使用ObjectDataSource或SqlDataSource等DataSource控件的情况,这些控件具有在其中指定的总行数。需要一些辅助方法来确保我们获得正确的值:

//Gets row count from SqlDataSource and the like...
private int _GetTotalRowsFromDataSourceObject(IEnumerable dataSource)
{
    DataSourceView view = this.GetData(); if (AllowPaging && view.CanPage && view.CanRetrieveTotalRowCount)
        return base.SelectArguments.TotalRowCount;
    else
        return (PageIndex * PageSize) + _GetSourceCount(dataSource);
}
//Gets the row count from a manually bound source or from a source in viewstate
private int _GetSourceCount(IEnumerable dataSource)
{
    ICollection source = dataSource as ICollection;
    return source != null ?
         source.Count :
         (from x in dataSource.OfType<object>() select 1).Sum();
}

_GetTotalRowsFromDataSourceObject方法从DataSource对象中检索记录总数(如果可用)。这取决于几个方面,例如是否在DataSource控件上设置了EnablePaging属性以及Object是否已完成查询操作。最糟糕的情况是,我们返回单页数据并完成它。 _GetSourceCount方法用于两种特定情况。首先,它是如何在手动绑定网格的DataSource属性然后调用DataBind()的情况下获取行计数的。其次,当网格在回发到存储在视图状态中的数据之后重新绑定时,此方法也将证明是有用的。在这两种情况下,我们使用一点linq来提取数据源中结果数据项(或视图状态中的行)的总数。现在让我们看看我们如何使用这些方法将它们联系在一起:

protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)
   {
       int baseResult = base.CreateChildControls(dataSource, dataBinding);
       if (dataSource != null)
       {
           int dataSourceCount = (IsBoundUsingDataSourceID && dataBinding) ?
               _GetTotalRowsFromDataSource(dataSource) :
               _GetSourceCount(dataSource);
           OnTotalRowCountAvailable(new PageEventArgs(StartRowIndex, MaximumRows, dataSourceCount));
       }
       return baseResult;
   }

首先调用基本控件的CreateChildControls方法,因为网格使用它来实际进行数据绑定。如果没有要绑定的数据,则没有理由通知寻呼机,因此我们检查以确保我们有数据,然后通过上述过程确定源中的行数。最后,我们使用派生数据触发事件,然后返回原始结果,以免影响可能依赖它的任何其他操作。我们现在有一个GridView可以与新的DataPager控件结合使用。这是我们用来在页面上一起使用这些控件的标记示例:

<asp:DataPager ID="DataPager1" runat="server" PageSize="2" PagedControlID="grid2">
    <Fields>
        <asp:NextPreviousPagerField />
    </Fields>
</asp:DataPager>

<custom:pageablegridview id="grid2" runat="server" autogeneratecolumns="true" allowpaging="true"
        onpageindexchanging="grid2_PageIndexChanging" />

请注意,我不必指定GridView的PageSize属性,因为DataPager上的PageSize属性将控制此值。为了确保这一点,我们可以隐藏网格上的PageSize属性,但现在就足够了。所以它真的就是这样。对于绑定到数据的新创建的服务器控件,使这些控件与DataPager一起使用非常简单。对于现有的控件,比如GridView,只需知道绑定是如何发生的,然后在知道所需值存在的地方注入功能。