需求: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 里没有这个属性啊。
Developer Express WinForms 控件包里面好像有这个,不记得了
(2) create an User Control integrate with datagridview 、vscrollbar、hscrollbarIs ok?Thanks for u any suggestion
vscrollbar通过datagridview的FirstDisplayedScrollingRowIndex控制上下滚动.
hscrollbar通过datagridview的HorizontalScrollingOffset属性控制左右滚动.
一开始想override onpaint 事件,但这个事件是不会被调用的。vscrollbar 的paint是O/s来做的。
然后 Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) 方法来重写。问题是怎么重写呢?
ForColor这些是无法重写的?很郁闷还有那个滚动条的样式等等这些又通过哪些属性和方法来做?难道继承自vscrollbar是行不通的?难道要重新写一个custom control???
关键是不知道如何绘。举个例子。比如滚动条上又两个箭头的图标,如果想重绘它涉及的关键方法或属性是什么?
只能是自己完全重新写一个 scrollbar了。。
也许已能说明,scrollbar不能做到通过继承来改变外观样式.
-------------------------------
那就是说滚动条是继承自 Control来写的。把写好的滚动条和其他控件放在一起。
This method supports the .NET Framework infrastructure and is not intended to be used directly from your code. 比如onpaint、onmouseover...等等,如果你override这些事件你会发现,这些不会触发的。关键是想什么办法能触发它。只要能触发就能重写scrollbar
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);
}
}
你if (m.Msg == 0x000F)是可以变相的把SCROLLBAR外观重写的。但当鼠标拖动滚动条的时候,系统滚动条又出现了还有当鼠标经过的时候,等等这些都会恢复到系统滚动条。
但是 m.Msg里捕捉的鼠标的的事件没有这么细致的,WndProc里鼠标的多个事件是同一个编号的,所以无法实现实现想要的功能。