需求:Winform 里的 DataGridview 自身是有滚动条的。但那个滚动条无法进行背景色修改、修改方向箭等功能。目的:(1)为Datagridview创建一个滚动条,这个滚动条的背景颜色、箭头方向图片等和滚动条相关的属性可以自己控制以达到美化目的。
问题:
(1)初步想法如下:
(a) 继承自UserControl来创建 新的滚动条 或者(b) 继承自VScrollBar/HScrollBar来创建滚动条。
问题是创建的滚动条如何来控制DataGridView里的记录的显示,使之根据滚动条的位置来显示记录?      附件:
http://www.codeproject.com/KB/miscctrl/customscrollbar.aspx
里面使通过改变panel 的AutoScrollPosition 属性来触发Panel本身的滚动事件(它通过两个Panel来隐藏panel的滚动条)
可在 Datagridview 里没有这个属性啊。

解决方案 »

  1.   

    很好很强大
    Developer Express WinForms 控件包里面好像有这个,不记得了
      

  2.   

    My idea:(1) create 3 components inherit from system control: datagridview 、vscrollbar、hscrollbar
    (2) create an User Control integrate with datagridview 、vscrollbar、hscrollbarIs ok?Thanks for u any suggestion
      

  3.   

    用三个控件datagridview 、vscrollbar、hscrollbar 组合,是可行的!
    vscrollbar通过datagridview的FirstDisplayedScrollingRowIndex控制上下滚动.
    hscrollbar通过datagridview的HorizontalScrollingOffset属性控制左右滚动.
      

  4.   

    建立一个component class 继承自 vscrollbar但是不知道如何重写vscrollbar的外观。。
    一开始想override onpaint 事件,但这个事件是不会被调用的。vscrollbar 的paint是O/s来做的。
    然后 Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 方法来重写。问题是怎么重写呢?
    ForColor这些是无法重写的?很郁闷还有那个滚动条的样式等等这些又通过哪些属性和方法来做?难道继承自vscrollbar是行不通的?难道要重新写一个custom control???
      

  5.   

    ^ō^ 5L的方法行得通, 另外, DataGridview 是自绘滚动条, 所以可以拦截消息(处理)达到重绘的效果...
      

  6.   

    谢谢楼上的回复,关键是如何重绘。我上面页提到了建立一个继承自 vscrollbar的控件,想重绘原来的外观。
    关键是不知道如何绘。举个例子。比如滚动条上又两个箭头的图标,如果想重绘它涉及的关键方法或属性是什么?
      

  7.   

    Keep in touch, step into when have time. sorry.
      

  8.   

    继承自vhscrollbar 来做一个vScrollbar 已实现修改其背景颜色、滚动块的图片、箭头的图片等等这应该是不行的。
    只能是自己完全重新写一个 scrollbar了。。
      

  9.   

    楼主你了解donetbar控件包吗?我看过,它很多的控件,是继承自.net的原控件,改变显示效果.但里面的滚动条,是自己重写的.
    也许已能说明,scrollbar不能做到通过继承来改变外观样式.
      

  10.   

    不了解控件包。我看过,它很多的控件,是继承自.net的原控件,改变显示效果.但里面的滚动条,是自己重写的
    -------------------------------
    那就是说滚动条是继承自 Control来写的。把写好的滚动条和其他控件放在一起。
      

  11.   

    vscrollbar里的很多方法 是:
    This method supports the .NET Framework infrastructure and is not intended to be used directly from your code. 比如onpaint、onmouseover...等等,如果你override这些事件你会发现,这些不会触发的。关键是想什么办法能触发它。只要能触发就能重写scrollbar
      

  12.   

    这些东西的绘制过程和其他不触发的事件,不是.net来控制的,是受O/S控制的谢谢各位的答复。
      

  13.   

    //那就是说滚动条是继承自 Control来写的。把写好的滚动条和其他控件放在一起。我看那控件包,确实是这样.自己写的scrollBar,其他控件需要时(如panel),再把该scrollbar做进其他控件里.现在用XP的比例很大,scrollbar即使用默认样式,在XP系统里也是比较好看的外观.自己写一个,没必要吧?
      

  14.   

    其实当初我是使用类似5L的方法解决这个问题的, 至于拦截 DataGridview 的消息重绘滚动条, 由于能力(时间)有限, 所以未能实现...现在手上还有一份关于 ListView 滚动条的换肤方案, 是用 Delphi 做的...由于本人不懂 Delphi 所以迟迟未能实现 DataGridview 滚动条的直接重绘(是个遗憾)...地址: http://www.wesoho.com/article.asp?id=2192 由于现在不再负责控件开发工作, 如果LZ懂 Delphi 希望对你有所帮助...假如真的可以完成, 我最希望的就是LZ或其他达人们能够将对应的.Net版本代码共享出来, 可供大家学习学习...或者把代码发给我一份: [email protected]仅供参考, 继续关注...^ō^
      

  15.   


     protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                if (m.Msg == 0x000F)
                {
                    Graphics g = this.CreateGraphics();
                    g.DrawRectangle(SystemPens.ActiveCaption, this.ClientRectangle);
                    g.FillRectangle(SystemBrushes.ActiveCaption, this.ClientRectangle);
                }
            }
      

  16.   

    [Quote=引用 22 楼 csharp_start 的回复:]
    你if (m.Msg == 0x000F)是可以变相的把SCROLLBAR外观重写的。但当鼠标拖动滚动条的时候,系统滚动条又出现了还有当鼠标经过的时候,等等这些都会恢复到系统滚动条。
    但是 m.Msg里捕捉的鼠标的的事件没有这么细致的,WndProc里鼠标的多个事件是同一个编号的,所以无法实现实现想要的功能。
      

  17.   

    VScrollbar的一些事件在MSDN上这样注释的: This event supports the .NET Framework infrastructure and is not intended to be used directly from your code 比如onpaint 事件,我想override onpaint ,但调试发现,该事件没有被触发。 如何想其他办法触发呢?这个可以 Overrides Sub WndProc 来变相的实现onpaint的功能。但是 vscrollbar 的 许多鼠标 事件 例如MouseClick  ,都是这样的,而WndProc里鼠标的多个事件是同一个编号的,那岂不是既无法变相override 它,也无法这届override这些事件了??? 有什么办法来解决呢???除了完全重新写一个vscrollbar。 
      

  18.   

    再次谢谢各位的答复,看来继承自vscrollbar是无法实现要求的。只能继承自UserControl或者Control来做了。