找回密码
 立即注册

QQ登录

只需一步,快速开始

oceansoft
高级会员   /  发表于:2013-4-2 09:45  /   查看:8695  /  回复:8
我是把这个控件作为了应用中的数据显示网格使用的,由于数据多,所以我们设置了允许其显示滚动条,但是一旦把滚动条拖动到底,那么就会有一大片透明的非数据区域,是不是可以拿掉,或者通过什么方法,达到跟普通网友滚动条一样的效果。

8 个回复

倒序浏览
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-2 14:03:00
沙发
oceansoft 你好

非常感谢你使用金牌服务,Spread Silverlight中提供了分为多层显示的不同对象,所以没有提供普通表格那样的显示方式,无法将空白区域去掉

作为替代方案,你可以参考这个帖子:http://gcdn.grapecity.com/showtopic-8191.html
回复 使用道具 举报
oceansoft
高级会员   /  发表于:2013-4-2 14:35:00
板凳
谢谢!
我试了你提供的解决方案,感觉如下地方不好解决:
1、滚动条不能平滑移动,一移就是一个单元格,感觉不顺畅
2、滚动条到底后,最后一行(或最后一列)单元格整合跟底边吻合,滚动条也要到底
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-2 19:26:00
地板
oceansoft 你好

以上方法是该需求的替代方案,与普通表格的现实方式会存在一些差异,最终是否需要添加该功能还需要你这边来决定。
回复 使用道具 举报
oceansoft
高级会员   /  发表于:2013-4-3 14:37:00
5#
如果可以按照一个单元格的高度、宽度进行滚动,那么在滚动条到底,不能拖的时候,显示如果效果,我该怎么弄啊》
2.png
回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-3 17:47:00
6#
只能模拟这样的效果,滚动条的位置会有些差异:
  1.     public partial class MainPage : UserControl
  2.     {

  3.         int rows, cols; // i 表示能滚动的最后一行, j 表示能滚动的最后一列        

  4.         public MainPage()
  5.         {
  6.             InitializeComponent();
  7.             
  8.             this.gcSpreadSheet1.ShowActiveCell(GrapeCity.Windows.SpreadSheet.UI.VerticalPosition.Top, GrapeCity.Windows.SpreadSheet.UI.HorizontalPosition.Left);

  9.             gcSpreadSheet1.ScrollBarTrackPolicy = GrapeCity.Windows.SpreadSheet.UI.ScrollBarTrackPolicy.Both;

  10.             gcSpreadSheet1.SizeChanged += new SizeChangedEventHandler(gcSpreadSheet1_SizeChanged);
  11.             gcSpreadSheet1.TopRowChanged += new EventHandler<GrapeCity.Windows.SpreadSheet.UI.ViewportEventArgs>(gcSpreadSheet1_TopRowChanged);
  12.             gcSpreadSheet1.LeftColumnChanged += new EventHandler<GrapeCity.Windows.SpreadSheet.UI.ViewportEventArgs>(gcSpreadSheet1_LeftColumnChanged);            
  13.         }

  14.         void gcSpreadSheet1_SizeChanged(object sender, SizeChangedEventArgs e)
  15.         {
  16.             rows = this.gcSpreadSheet1.GetViewportBottomRow(this.gcSpreadSheet1.GetActiveRowViewportIndex()) + 1;
  17.             cols = this.gcSpreadSheet1.GetViewportRightColumn(this.gcSpreadSheet1.GetActiveColumnViewportIndex()) + 1;            
  18.         }

  19.         void gcSpreadSheet1_LeftColumnChanged(object sender, GrapeCity.Windows.SpreadSheet.UI.ViewportEventArgs e)
  20.         {
  21.             if (gcSpreadSheet1.GetViewportRightColumn(gcSpreadSheet1.ActiveSheetIndex) == gcSpreadSheet1.ActiveSheet.ColumnCount-1)
  22.             {
  23.                 gcSpreadSheet1.SetViewportLeftColumn(this.gcSpreadSheet1.GetActiveColumnViewportIndex(), gcSpreadSheet1.ActiveSheet.ColumnCount - cols);
  24.             }
  25.         }

  26.         void gcSpreadSheet1_TopRowChanged(object sender, GrapeCity.Windows.SpreadSheet.UI.ViewportEventArgs e)
  27.         {
  28.             if (gcSpreadSheet1.GetViewportBottomRow(gcSpreadSheet1.ActiveSheetIndex) == gcSpreadSheet1.ActiveSheet.RowCount - 1)
  29.             {
  30.                 gcSpreadSheet1.SetViewportTopRow(this.gcSpreadSheet1.GetActiveRowViewportIndex(), gcSpreadSheet1.ActiveSheet.RowCount - rows);
  31.             }
  32.         }
  33.     }
复制代码
回复 使用道具 举报
oceansoft
高级会员   /  发表于:2013-4-7 10:32:00
7#

还有一些小问题

应用了你提供的方法后,还有一些小问题:
1、滚动条拖到最大时,没有跟边界对其,给人没有拖到底的感觉
2、还是会留出一些非数据区域,只是比原来小点
1.PNG
回复 使用道具 举报
oceansoft
高级会员   /  发表于:2013-4-7 12:17:00
8#

我们的一个DEMO

回复 7楼oceansoft的帖子

为了把我的需求能够表达清楚,我做了一个DEMO。
表格本身的大小、单元格的大小在我们的应用中允许用户动态调整的,调整后,滚动条会出现一些拖动和显示上的异常。

SilverlightApplication8.zip

1.6 MB, 下载次数: 348

回复 使用道具 举报
ZenosZeng讲师达人认证 悬赏达人认证
超级版主   /  发表于:2013-4-7 15:47:00
9#
以滚动横向滚动条为例,可以参考以下代码进行实现,这种方法可能会在最后出现小范围的空白区,如果不想看到任何的空白区域,可以动态调整最后一列的宽度:
  1.      public MainPage()
  2.     {
  3.         InitializeComponent();

  4.         gcSpreadSheet1.ScrollBarTrackPolicy = GrapeCity.Windows.SpreadSheet.UI.ScrollBarTrackPolicy.Both;
  5.         gcSpreadSheet1.TopRowChanged += new EventHandler<GrapeCity.Windows.SpreadSheet.UI.ViewportEventArgs>(gcSpreadSheet1_TopRowChanged);
  6.         gcSpreadSheet1.LeftColumnChanged += new EventHandler<GrapeCity.Windows.SpreadSheet.UI.ViewportEventArgs>(gcSpreadSheet1_LeftColumnChanged);            
  7.         gcSpreadSheet1.RowHeightChanged += new EventHandler<GrapeCity.Windows.SpreadSheet.UI.RowHeightChangedEventArgs>(gcSpreadSheet1_RowHeightChanged);
  8.         gcSpreadSheet1.ColumnWidthChanged += new EventHandler<GrapeCity.Windows.SpreadSheet.UI.ColumnWidthChangedEventArgs>(gcSpreadSheet1_ColumnWidthChanged);
  9.     }

  10.     void gcSpreadSheet1_LeftColumnChanged(object sender, GrapeCity.Windows.SpreadSheet.UI.ViewportEventArgs e)
  11.     {
  12.         if (e.NewIndex < e.OldIndex)
  13.         {
  14.             return;
  15.         }

  16.         if (gcSpreadSheet1.GetViewportRightColumn(gcSpreadSheet1.ActiveSheetIndex) == gcSpreadSheet1.ActiveSheet.ColumnCount - 1)
  17.         {
  18.             double width = 0;
  19.             double vwidth = gcSpreadSheet1.ActualWidth - gcSpreadSheet1.ActiveSheet.RowHeader.Columns[0].ActualWidth;
  20.             int col = gcSpreadSheet1.ActiveSheet.Columns.Count-1;

  21.             for (; col >= 0; col--)
  22.             {
  23.                 width += gcSpreadSheet1.ActiveSheet.Columns[col].ActualWidth;                  
  24.                 if (width > vwidth)
  25.                 {
  26.                     gcSpreadSheet1.SetViewportLeftColumn(this.gcSpreadSheet1.GetActiveColumnViewportIndex(), col+1);
  27.                     break;
  28.                 }
  29.             }
  30.         }
  31.     }

  32.     void gcSpreadSheet1_TopRowChanged(object sender, GrapeCity.Windows.SpreadSheet.UI.ViewportEventArgs e)
  33.     {
  34.         if (e.NewIndex < e.OldIndex)
  35.         {
  36.             return;
  37.         }

  38.         if (gcSpreadSheet1.GetViewportBottomRow(gcSpreadSheet1.ActiveSheetIndex) == gcSpreadSheet1.ActiveSheet.RowCount - 1)
  39.         {
  40.             double height = 0;
  41.             double vheight = gcSpreadSheet1.ActualHeight - gcSpreadSheet1.ActiveSheet.ColumnHeader.Rows[0].ActualHeight;
  42.             int row = gcSpreadSheet1.ActiveSheet.Rows.Count - 1;

  43.             for (; row >= 0; row--)
  44.             {
  45.                 height += gcSpreadSheet1.ActiveSheet.Rows[row].ActualHeight;
  46.                 if (height > vheight)
  47.                 {
  48.                     gcSpreadSheet1.SetViewportTopRow(this.gcSpreadSheet1.GetActiveRowViewportIndex(), row + 1);
  49.                     break;
  50.                 }
  51.             }
  52.         }
  53.     }

  54.     private void gcSpreadSheet1_ColumnWidthChanged(object sender, GrapeCity.Windows.SpreadSheet.UI.ColumnWidthChangedEventArgs e)
  55.     {
  56.         this.gcSpreadSheet1.ActiveSheet.Columns[gcSpreadSheet1.ActiveSheet.ColumnCount - 1].Width = gcSpreadSheet1.ActualWidth - gcSpreadSheet1.ActiveSheet.RowHeader.Columns[0].ActualWidth;
  57.     }

  58.     private void gcSpreadSheet1_RowHeightChanged(object sender, GrapeCity.Windows.SpreadSheet.UI.RowHeightChangedEventArgs e)
  59.     {
  60.         this.gcSpreadSheet1.ActiveSheet.Rows[gcSpreadSheet1.ActiveSheet.RowCount - 1].Height = gcSpreadSheet1.ActualHeight - gcSpreadSheet1.ActiveSheet.ColumnHeader.Rows[0].ActualHeight;
  61.     }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部