前提

入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

GitHub:https://github.com/kwwwvagaa/NetWinformControl

码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

如果觉得写的还行,请点个 star 支持一下吧

欢迎前来交流探讨: 企鹅群568015492 (八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)_listview

来都来了,点个【推荐】再走吧,谢谢

NuGet
Install-Package HZH_Controls
目录

http://www.hzhcontrols.com/blog-63.html

用处及效果

(八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)_datagridview_02

 

 准备工作

这个是在前面滚动条上完善的,加入了对常用控件滚动条的美化,实现逻辑是添加一个滚动条控件,然后覆盖在滚动条上面,然后实现联动

绘制滚动条的工作,你可以参考

(六十九)c#Winform自定义控件-垂直滚动条-HZHControls 

开始

添加一个组件ScrollbarComponent,

实现接口IExtenderProvider

 1   Dictionary<Control, bool> m_controlCache = new Dictionary<Control, bool>(); 2         public bool CanExtend(object extendee) 3         { 4             if (extendee is ScrollableControl) 5             { 6                 ScrollableControl control = (ScrollableControl)extendee; 7                 if (control.AutoScroll == true) 8                 { 9                     return true;10                 }11             }12             else if (extendee is TreeView)13             {14                 TreeView control = (TreeView)extendee;15                 if (control.Scrollable)16                 {17                     return true;18                 }19             }20             else if (extendee is TextBox)21             {22                 TextBox control = (TextBox)extendee;23                 if (control.Multiline && control.ScrollBars != ScrollBars.None)24                 {25                     return true;26                 }27             }28             else if (extendee is RichTextBox)29             {30                 return true;31             }32             else if (extendee is ListBox)33             {34                 return true;35             }36             //else if (extendee is ListView)37             //{38             //    return true;39             //}40             else if (extendee is DataGridView)41             {42                 return true;43             }44             return false;45         }

添加扩展属性

 1  [Browsable(true), Category("自定义属性"), Description("是否使用自定义滚动条"), DisplayName("UserCustomScrollbar"), Localizable(true)] 2         public bool GetUserCustomScrollbar(Control control) 3         { 4             if (m_controlCache.ContainsKey(control)) 5                 return m_controlCache[control]; 6             return true; 7         } 8  9         public void SetUserCustomScrollbar(Control control, bool blnUserCustomScrollbar)10         {11             m_controlCache[control] = blnUserCustomScrollbar;12             if (!blnUserCustomScrollbar)13                 return;14 15             if (control is TreeView)16             {17                 TreeView tv = (TreeView)control;18                 //tv.MouseWheel += tv_MouseWheel;19                 //tv.AfterSelect += tv_AfterSelect;20                 tv.AfterExpand += tv_AfterExpand;21                 tv.AfterCollapse += tv_AfterCollapse;22             }23             else if (control is TextBox)24             {25                 TextBox txt = (TextBox)control;26                 //txt.MouseWheel += txt_MouseWheel;27                 txt.TextChanged += txt_TextChanged;28                 txt.KeyDown += txt_KeyDown;29             }30             else if (control is RichTextBox)31             {32                 RichTextBox txt = (RichTextBox)control;33                 //txt.MouseWheel += txt_MouseWheel;34                 txt.TextChanged += txt_TextChanged;35                 txt.KeyDown += txt_KeyDown;36             }37             else if (control is ListBox)38             {39                 ListBox lb = (ListBox)control;40                 lb.DataSourceChanged += Lb_DataSourceChanged;41                 lb.SelectedIndexChanged += Lb_SelectedIndexChanged;                
42             }43             //else if (control is ListView)44             //{45             //    ListView lv = (ListView)control;46 47             //}48             else if (control is DataGridView)49             {50                 DataGridView dgv = (DataGridView)control;51                 dgv.DataSourceChanged += dgv_DataSourceChanged;52                 dgv.RowsAdded += dgv_RowsAdded;53                 dgv.RowsRemoved += dgv_RowsRemoved;54                 dgv.Scroll += dgv_Scroll;55             }56 57             control.VisibleChanged += control_VisibleChanged;58             control.SizeChanged += control_SizeChanged;59             control.LocationChanged += control_LocationChanged;60             control.Disposed += control_Disposed;61             control.MouseWheel += Control_MouseWheel;62             control_SizeChanged(control, null);63         }

控件大小改变的时候处理滚动条显示

  1 void control_SizeChanged(object sender, EventArgs e)  2         {  3             if (ControlHelper.IsDesignMode())  4             {  5                 return;  6             }  7             else  8             {  9                 var control = sender as Control; 10  11                 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0; 12                 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0; 13                 if (control is TextBox) 14                 { 15                     var txt = (TextBox)control; 16                     if (txt.ScrollBars == ScrollBars.Both) 17                     { 18                         blnHasVScrollbar = true; 19                         blnHasHScrollbar = true; 20                     } 21                     else if (txt.ScrollBars == ScrollBars.Vertical) 22                     { 23                         blnHasVScrollbar = true; 24                         blnHasHScrollbar = false; 25                     } 26                     else if (txt.ScrollBars == ScrollBars.Horizontal) 27                     { 28                         blnHasVScrollbar = false; 29                         blnHasHScrollbar = true; 30                     } 31                     else 32                     { 33                         blnHasVScrollbar = false; 34                         blnHasHScrollbar = false; 35                     } 36                 } 37                 else if (control is DataGridView) 38                 { 39                     var dgv = (DataGridView)control; 40                     if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical) 41                     { 42                         int _height = dgv.RowTemplate.Height * dgv.Rows.Count; 43                         if (dgv.ColumnHeadersVisible) 44                         { 45                             _height += dgv.ColumnHeadersHeight; 46                         } 47                         blnHasVScrollbar = _height > dgv.Height; 48                     } 49                     if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal) 50                     { 51                         int _width = 0; 52                         foreach (DataGridViewColumn com in dgv.Columns) 53                         { 54                             _width += com.Width; 55                         } 56                         if (dgv.RowHeadersVisible) 57                         { 58                             _width += dgv.RowHeadersWidth; 59                         } 60                         blnHasHScrollbar = _width > dgv.Width; 61                     } 62                 } 63                 else if (control is ListView) 64                 { 65                     if (!((ListView)control).Scrollable) 66                     { 67                         blnHasVScrollbar = false; 68                         blnHasHScrollbar = false; 69                     } 70                 } 71                 if (blnHasVScrollbar) 72                 { 73                     if (!m_lstVCache.ContainsKey(control)) 74                     { 75                         if (control.Parent != null) 76                         { 77                             UCVScrollbar barV = new UCVScrollbar(); 78                             barV.SmallChange = 5; 79                             barV.Width = SystemInformation.VerticalScrollBarWidth + 1; 80                             barV.Scroll += barV_Scroll; 81                             m_lstVCache[control] = barV; 82                             if (blnHasHScrollbar) 83                             { 84                                 barV.Height = control.Height - barV.Width; 85                             } 86                             else 87                             { 88                                 barV.Height = control.Height; 89                             } 90                             SetVMaxNum(control); 91                             barV.Location = new System.Drawing.Point(control.Right - barV.Width, control.Top); 92                             control.Parent.Controls.Add(barV); 93                             int intControlIndex = control.Parent.Controls.GetChildIndex(control); 94                             control.Parent.Controls.SetChildIndex(barV, intControlIndex); 95                         } 96                     } 97                     else 98                     { 99                         if (blnHasHScrollbar)100                         {101                             m_lstVCache[control].Height = control.Height - m_lstVCache[control].Width;102                         }103                         else104                         {105                             m_lstVCache[control].Height = control.Height;106                         }107                         SetVMaxNum(control);108                     }109                 }110                 else111                 {112                     if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null)113                     {114                         m_lstVCache[control].Visible = false;115                     }116                 }117 118                 if (blnHasHScrollbar)119                 {120                     if (!m_lstHCache.ContainsKey(control))121                     {122                         if (control.Parent != null)123                         {124                             UCHScrollbar barH = new UCHScrollbar();125                             barH.Height = SystemInformation.HorizontalScrollBarHeight + 1;126                             barH.SmallChange = 5;127 128                             barH.Scroll += barH_Scroll;129                             m_lstHCache[control] = barH;130                             if (blnHasHScrollbar)131                             {132                                 barH.Width = control.Width - barH.Height;133                             }134                             else135                             {136                                 barH.Width = control.Width;137                             }138                             SetHMaxNum(control);139                             barH.Location = new System.Drawing.Point(control.Left, control.Bottom - barH.Height);140                             control.Parent.Controls.Add(barH);141                             int intControlIndex = control.Parent.Controls.GetChildIndex(control);142                             control.Parent.Controls.SetChildIndex(barH, intControlIndex);143                         }144                     }145                     else146                     {147                         if (blnHasHScrollbar)148                         {149                             m_lstHCache[control].Width = control.Width - m_lstHCache[control].Height;150                         }151                         else152                         {153                             m_lstHCache[control].Width = control.Width;154                         }155                         SetHMaxNum(control);156                     }157                 }158                 else159                 {160                     if (m_lstHCache.ContainsKey(control))161                     {162                         if (m_lstHCache[control].Visible && m_lstHCache[control].Parent != null)163                         {164                             m_lstHCache[control].Visible = false;165                         }166                     }167                 }168             }169             ResetScrollLocation(sender);170         }

修改横竖滚动条值

  1  private void SetVMaxNum(Control control)  2         {  3             if (!m_lstVCache.ContainsKey(control))  4                 return;  5             var intoV = ControlHelper.GetVScrollBarInfo(control.Handle);  6             UCVScrollbar barV = m_lstVCache[control];  7             if (control is ScrollableControl)  8             {  9                 barV.Maximum = intoV.ScrollMax; 10                 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0; 11                 barV.Value = intoV.nPos; 12                 barV.BringToFront(); 13                 // barV.Maximum = (control as ScrollableControl).VerticalScroll.Maximum; 14                 // barV.Value = (control as ScrollableControl).VerticalScroll.Value; 15             } 16             else if (control is TreeView) 17             { 18                 var tv = control as TreeView; 19                 barV.Maximum = intoV.ScrollMax * tv.ItemHeight; 20                 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0; 21                 barV.Value = intoV.nPos * tv.ItemHeight; 22                 barV.BringToFront(); 23  24                 //barV.Maximum = GetTreeNodeMaxY(control as TreeView) - control.Height; 25                 //barV.Value = (control as TreeView).AutoScrollOffset.Y; 26             } 27             else if (control is TextBox) 28             { 29                 TextBox txt = (TextBox)control; 30                 barV.Maximum = intoV.ScrollMax * txt.PreferredHeight; 31                 if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Vertical) 32                 { 33                     barV.Visible = true; 34                 } 35                 else 36                 { 37                     barV.Visible = false; 38                 } 39                 barV.Value = intoV.nPos * txt.PreferredHeight; 40                 barV.BringToFront(); 41             } 42             else if (control is RichTextBox) 43             { 44                 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0; 45                 barV.Maximum = intoV.ScrollMax; 46                 barV.Visible = blnHasVScrollbar; 47                 barV.Value = intoV.nPos; 48                 barV.BringToFront(); 49             } 50             else if (control is ListBox) 51             { 52                 var lb = control as ListBox; 53                 if (intoV.ScrollMax <= 1) 54                 { 55                     var v = lb.ItemHeight * lb.Items.Count - lb.Height; 56                     if (v > 0) 57                         barV.Maximum = v; 58                     else 59                         barV.Maximum = intoV.ScrollMax * lb.ItemHeight; 60                 } 61                 else 62                 { 63                     barV.Maximum = intoV.ScrollMax * lb.ItemHeight; 64                 } 65                 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0; 66                 barV.Value = intoV.nPos * lb.ItemHeight; 67                 barV.BringToFront(); 68             } 69             else if (control is ListView) 70             { 71                 barV.Maximum = intoV.ScrollMax; 72                 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0; 73                 barV.Value = intoV.nPos; 74                 barV.BringToFront(); 75             } 76             else if (control is DataGridView) 77             { 78                 bool blnHasVScrollbar = false; 79                 var dgv = (DataGridView)control; 80                 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical) 81                 { 82                     int _height = dgv.RowTemplate.Height * dgv.Rows.Count; 83                     if (dgv.ColumnHeadersVisible) 84                     { 85                         _height += dgv.ColumnHeadersHeight; 86                     } 87                     blnHasVScrollbar = _height > dgv.Height; 88                 } 89                 barV.Maximum = dgv.Rows.Count; 90                 barV.Visible = blnHasVScrollbar; 91                 barV.Value = dgv.FirstDisplayedScrollingRowIndex; ; 92                 barV.BringToFront(); 93             } 94         } 95         private void SetHMaxNum(Control control) 96         { 97             if (!m_lstHCache.ContainsKey(control)) 98                 return; 99             var intoH = ControlHelper.GetHScrollBarInfo(control.Handle);100             UCHScrollbar barH = m_lstHCache[control];101             if (control is ScrollableControl)102             {103                 barH.Maximum = intoH.ScrollMax;104                 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;105                 barH.Value = intoH.nPos;106                 barH.BringToFront();107 108                 //barH.Maximum = (control as ScrollableControl).HorizontalScroll.Maximum;109                 //barH.Value = (control as ScrollableControl).HorizontalScroll.Value;110             }111             else if (control is TreeView)112             {113                 var tv = control as TreeView;114                 barH.Maximum = intoH.ScrollMax;115                 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;116                 barH.Value = intoH.nPos;117                 barH.BringToFront();118                 //barH.Maximum = GetTreeNodeMaxX(control as TreeView);119                 //barH.Value = (control as TreeView).AutoScrollOffset.X;120             }121             else if (control is TextBox)122             {123                 TextBox txt = (TextBox)control;124                 barH.Maximum = intoH.ScrollMax;125 126                 if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Horizontal)127                 {128                     barH.Visible = true;129                 }130                 else131                 {132                     barH.Visible = false;133                 }134 135                 barH.Value = intoH.nPos;136                 barH.BringToFront();137             }138             else if (control is RichTextBox)139             {140                 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;141 142                 barH.Maximum = intoH.ScrollMax;143                 barH.Visible = blnHasHScrollbar;144                 barH.Value = intoH.nPos;145                 barH.BringToFront();146             }147             else if (control is ListBox)148             {149                 var lb = control as ListBox;150                 barH.Maximum = intoH.ScrollMax * lb.ItemHeight;151                 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;152                 barH.Value = intoH.nPos * lb.ItemHeight;153                 barH.BringToFront();154             }155             else if (control is ListView)156             {157                 barH.Maximum = intoH.ScrollMax;158                 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;159                 barH.Value = intoH.nPos;160                 barH.BringToFront();161             }162             else if (control is DataGridView)163             {164                 bool blnHasHScrollbar = false;165                 var dgv = (DataGridView)control;166                 int _width = 0;167                 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)168                 {169                     foreach (DataGridViewColumn com in dgv.Columns)170                     {171                         _width += com.Width;172                     }173                     if (dgv.RowHeadersVisible)174                     {175                         _width += dgv.RowHeadersWidth;176                     }177                     blnHasHScrollbar = _width > dgv.Width;178                 }179                 if (blnHasHScrollbar)180                     barH.Maximum = _width - dgv.Width;181                 barH.Visible = blnHasHScrollbar;182                 barH.Value = dgv.FirstDisplayedScrollingColumnHiddenWidth;183                 barH.BringToFront();184             }185         }

位置改变时候修改滚动条

 1   private void ResetScrollLocation(object sender) 2         { 3             Control control = (Control)sender; 4             bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0; 5             bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0; 6             if (control is TextBox) 7             { 8                 var txt = (TextBox)control; 9                 if (txt.ScrollBars == ScrollBars.Both)10                 {11                     blnHasVScrollbar = true;12                     blnHasHScrollbar = true;13                 }14                 else if (txt.ScrollBars == ScrollBars.Vertical)15                 {16                     blnHasVScrollbar = true;17                     blnHasHScrollbar = false;18                 }19                 else if (txt.ScrollBars == ScrollBars.Horizontal)20                 {21                     blnHasVScrollbar = false;22                     blnHasHScrollbar = true;23                 }24                 else25                 {26                     blnHasVScrollbar = false;27                     blnHasHScrollbar = false;28                 }29             }30             else if (control is DataGridView)31             {32                 var dgv = (DataGridView)control;33                 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)34                 {35                     int _height = dgv.RowTemplate.Height * dgv.Rows.Count;36                     if (dgv.ColumnHeadersVisible)37                     {38                         _height += dgv.ColumnHeadersHeight;39                     }40                     blnHasVScrollbar = _height > dgv.Height;41                 }42                 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)43                 {44                     int _width = 0;45                     foreach (DataGridViewColumn com in dgv.Columns)46                     {47                         _width += com.Width;48                     }49                     if (dgv.RowHeadersVisible)50                     {51                         _width += dgv.RowHeadersWidth;52                     }53                     blnHasHScrollbar = _width > dgv.Width;54                 }55             }56             else if (control is ListView)57             {58                 if (!((ListView)control).Scrollable)59                 {60                     blnHasVScrollbar = false;61                     blnHasHScrollbar = false;62                 }63             }64             if (control.Visible)65             {66                 if (m_lstVCache.ContainsKey(control))67                 {68                     m_lstVCache[control].Location = new System.Drawing.Point(control.Right - m_lstVCache[control].Width, control.Top);69                     if (blnHasHScrollbar)70                     {71                         m_lstVCache[control].Height = control.Height - m_lstHCache[control].Height;72                     }73                     else74                     {75                         m_lstVCache[control].Height = control.Height;76                     }77                     SetVMaxNum(control);78                 }79 80                 if (m_lstHCache.ContainsKey(control))81                 {82                     m_lstHCache[control].Location = new System.Drawing.Point(control.Left, control.Bottom - m_lstHCache[control].Height);83                     //if (blnHasVScrollbar)84                     //{85                     //    m_lstHCache[control].Width = control.Width - m_lstVCache[control].Width;86                     //}87                     //else88                     //{89                     m_lstHCache[control].Width = control.Width;90                     //}91                     SetHMaxNum(control);92                 }93             }94         }

滑动滚动条的处理滚动

 1  void barV_Scroll(object sender, EventArgs e) 2         { 3             UCVScrollbar bar = (UCVScrollbar)sender; 4             if (m_lstVCache.ContainsValue(bar)) 5             { 6                 Control c = m_lstVCache.FirstOrDefault(p => p.Value == bar).Key; 7  8                 //ControlHelper.SetVScrollValue(c.Handle, bar.Value); 9                 if (c is ScrollableControl)10                 {11                     (c as ScrollableControl).AutoScrollPosition = new Point((c as ScrollableControl).AutoScrollPosition.X, bar.Value);12                 }13                 else if (c is TreeView)14                 {15                     ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TreeView).ItemHeight));16                 }17                 else if (c is TextBox)18                 {19                     ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TextBox).PreferredHeight));20                 }21                 else if (c is RichTextBox)22                 {23                     ControlHelper.SetVScrollValue(c.Handle, bar.Value);24                 }25                 else if (c is ListBox)26                 {27                     ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as ListBox).ItemHeight));28                 }29                 else if (c is ListView)30                 {31                     ControlHelper.SetVScrollValue(c.Handle, bar.Value);32                 }33                 else if (c is DataGridView)34                 {35                     var dgv = (DataGridView)c;36                     if(bar.Value>0)37                     dgv.FirstDisplayedScrollingRowIndex = bar.Value - 1;38                 }39             }40         }41 42         void barH_Scroll(object sender, EventArgs e)43         {44             UCHScrollbar bar = (UCHScrollbar)sender;45             if (m_lstHCache.ContainsValue(bar))46             {47                 Control c = m_lstHCache.FirstOrDefault(p => p.Value == bar).Key;48                 if (c is ScrollableControl)49                 {50                     (c as ScrollableControl).AutoScrollPosition = new Point(bar.Value, (c as ScrollableControl).AutoScrollPosition.Y);51                 }52                 else if (c is TreeView)53                 {54                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);55                     //TreeView tv = (c as TreeView);56                     //SetTreeViewVScrollLocation(tv, tv.Nodes, bar.Value);57                 }58                 else if (c is TextBox)59                 {60                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);61                     //TextBox txt = (c as TextBox);62                     //SetTextBoxVScrollLocation(txt, bar.Value);63                 }64                 else if (c is RichTextBox)65                 {66                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);67                 }68                 else if (c is ListBox)69                 {70                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);71                 }72                 else if (c is ListView)73                 {74                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);75                 }76                 else if (c is DataGridView)77                 {78                     var dgv = (DataGridView)c;79                     dgv.HorizontalScrollingOffset = bar.Value;80                 }81             }82         }

以下是全部代码

(八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)_textbox_03(八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)_datagridview_04

  1 using System;  2 using System.Collections.Generic;  3 using System.ComponentModel;  4 using System.Drawing;  5 using System.Linq;  6 using System.Text;  7 using System.Windows.Forms;  8   9 namespace HZH_Controls.Controls 10 { 11     [ProvideProperty("UserCustomScrollbar", typeof(Control))] 12     public class ScrollbarComponent : Component, IExtenderProvider 13     { 14         public ScrollbarComponent() 15         { 16  17         } 18  19         public ScrollbarComponent(IContainer container) 20         { 21             container.Add(this); 22         } 23  24         Dictionary<Control, bool> m_controlCache = new Dictionary<Control, bool>(); 25         public bool CanExtend(object extendee) 26         { 27             if (extendee is ScrollableControl) 28             { 29                 ScrollableControl control = (ScrollableControl)extendee; 30                 if (control.AutoScroll == true) 31                 { 32                     return true; 33                 } 34             } 35             else if (extendee is TreeView) 36             { 37                 TreeView control = (TreeView)extendee; 38                 if (control.Scrollable) 39                 { 40                     return true; 41                 } 42             } 43             else if (extendee is TextBox) 44             { 45                 TextBox control = (TextBox)extendee; 46                 if (control.Multiline && control.ScrollBars != ScrollBars.None) 47                 { 48                     return true; 49                 } 50             } 51             else if (extendee is RichTextBox) 52             { 53                 return true; 54             } 55             else if (extendee is ListBox) 56             { 57                 return true; 58             } 59             //else if (extendee is ListView) 60             //{ 61             //    return true; 62             //} 63             else if (extendee is DataGridView) 64             { 65                 return true; 66             } 67             return false; 68         } 69  70         [Browsable(true), Category("自定义属性"), Description("是否使用自定义滚动条"), DisplayName("UserCustomScrollbar"), Localizable(true)] 71         public bool GetUserCustomScrollbar(Control control) 72         { 73             if (m_controlCache.ContainsKey(control)) 74                 return m_controlCache[control]; 75             return true; 76         } 77  78         public void SetUserCustomScrollbar(Control control, bool blnUserCustomScrollbar) 79         { 80             m_controlCache[control] = blnUserCustomScrollbar; 81             if (!blnUserCustomScrollbar) 82                 return; 83  84             if (control is TreeView) 85             { 86                 TreeView tv = (TreeView)control; 87                 //tv.MouseWheel += tv_MouseWheel; 88                 //tv.AfterSelect += tv_AfterSelect; 89                 tv.AfterExpand += tv_AfterExpand; 90                 tv.AfterCollapse += tv_AfterCollapse; 91             } 92             else if (control is TextBox) 93             { 94                 TextBox txt = (TextBox)control; 95                 //txt.MouseWheel += txt_MouseWheel; 96                 txt.TextChanged += txt_TextChanged; 97                 txt.KeyDown += txt_KeyDown; 98             } 99             else if (control is RichTextBox)100             {101                 RichTextBox txt = (RichTextBox)control;102                 //txt.MouseWheel += txt_MouseWheel;103                 txt.TextChanged += txt_TextChanged;104                 txt.KeyDown += txt_KeyDown;105             }106             else if (control is ListBox)107             {108                 ListBox lb = (ListBox)control;109                 lb.DataSourceChanged += Lb_DataSourceChanged;110                 lb.SelectedIndexChanged += Lb_SelectedIndexChanged;                
111             }112             //else if (control is ListView)113             //{114             //    ListView lv = (ListView)control;115 116             //}117             else if (control is DataGridView)118             {119                 DataGridView dgv = (DataGridView)control;120                 dgv.DataSourceChanged += dgv_DataSourceChanged;121                 dgv.RowsAdded += dgv_RowsAdded;122                 dgv.RowsRemoved += dgv_RowsRemoved;123                 dgv.Scroll += dgv_Scroll;124             }125 126             control.VisibleChanged += control_VisibleChanged;127             control.SizeChanged += control_SizeChanged;128             control.LocationChanged += control_LocationChanged;129             control.Disposed += control_Disposed;130             control.MouseWheel += Control_MouseWheel;131             control_SizeChanged(control, null);132         }133 134         void dgv_Scroll(object sender, ScrollEventArgs e)135         {136             if (e.NewValue == e.OldValue)137                 return;138             DataGridView dgv = (DataGridView)sender;139             if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll)140             {141                 if (m_lstHCache.ContainsKey(dgv))142                 {143                     m_lstHCache[dgv].Value = e.NewValue;144                 }145             }146             else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll)147             {148                 if (m_lstVCache.ContainsKey(dgv))149                 {150                     m_lstVCache[dgv].Value = e.NewValue;151                 }152             }153         }154 155         void dgv_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)156         {157             Control control = sender as Control;158             control_SizeChanged(control, null);159         }160 161         void dgv_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)162         {163             Control control = sender as Control;164             control_SizeChanged(control, null);165         }166 167         void dgv_DataSourceChanged(object sender, EventArgs e)168         {169             Control control = sender as Control;170             control_SizeChanged(control, null);171         }172 173         private void Lb_SelectedIndexChanged(object sender, EventArgs e)174         {175             Control c = sender as Control;176             SetVMaxNum(c);177         }178 179         private void Lb_DataSourceChanged(object sender, EventArgs e)180         {181             Control c = sender as Control;182             control_SizeChanged(c, null);183         }184 185         private void Control_MouseWheel(object sender, MouseEventArgs e)186         {187             Control c = (Control)sender;188             if (m_lstVCache.ContainsKey(c))189             {190                 if (e.Delta > 5)191                 {192                     ControlHelper.ScrollUp(c.Handle);193                 }194                 else if (e.Delta < -5)195                 {196                     ControlHelper.ScrollDown(c.Handle);197                 }198 199                 SetVMaxNum(c);200             }201             else if (m_lstHCache.ContainsKey(c))202             {203                 if (e.Delta > 5)204                 {205                     ControlHelper.ScrollLeft(c.Handle);206                 }207                 else if (e.Delta < -5)208                 {209                     ControlHelper.ScrollRight(c.Handle);210                 }211 212                 SetHMaxNum(c);213             }214         }215 216         void control_Disposed(object sender, EventArgs e)217         {218             Control control = (Control)sender;219             if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null)220             {221                 m_lstVCache[control].Parent.Controls.Remove(m_lstVCache[control]);222                 m_lstVCache.Remove(control);223             }224         }225 226         void control_LocationChanged(object sender, EventArgs e)227         {228             ResetScrollLocation(sender);229         }230 231         void control_SizeChanged(object sender, EventArgs e)232         {233             if (ControlHelper.IsDesignMode())234             {235                 return;236             }237             else238             {239                 var control = sender as Control;240 241                 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;242                 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;243                 if (control is TextBox)244                 {245                     var txt = (TextBox)control;246                     if (txt.ScrollBars == ScrollBars.Both)247                     {248                         blnHasVScrollbar = true;249                         blnHasHScrollbar = true;250                     }251                     else if (txt.ScrollBars == ScrollBars.Vertical)252                     {253                         blnHasVScrollbar = true;254                         blnHasHScrollbar = false;255                     }256                     else if (txt.ScrollBars == ScrollBars.Horizontal)257                     {258                         blnHasVScrollbar = false;259                         blnHasHScrollbar = true;260                     }261                     else262                     {263                         blnHasVScrollbar = false;264                         blnHasHScrollbar = false;265                     }266                 }267                 else if (control is DataGridView)268                 {269                     var dgv = (DataGridView)control;270                     if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)271                     {272                         int _height = dgv.RowTemplate.Height * dgv.Rows.Count;273                         if (dgv.ColumnHeadersVisible)274                         {275                             _height += dgv.ColumnHeadersHeight;276                         }277                         blnHasVScrollbar = _height > dgv.Height;278                     }279                     if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)280                     {281                         int _width = 0;282                         foreach (DataGridViewColumn com in dgv.Columns)283                         {284                             _width += com.Width;285                         }286                         if (dgv.RowHeadersVisible)287                         {288                             _width += dgv.RowHeadersWidth;289                         }290                         blnHasHScrollbar = _width > dgv.Width;291                     }292                 }293                 else if (control is ListView)294                 {295                     if (!((ListView)control).Scrollable)296                     {297                         blnHasVScrollbar = false;298                         blnHasHScrollbar = false;299                     }300                 }301                 if (blnHasVScrollbar)302                 {303                     if (!m_lstVCache.ContainsKey(control))304                     {305                         if (control.Parent != null)306                         {307                             UCVScrollbar barV = new UCVScrollbar();308                             barV.SmallChange = 5;309                             barV.Width = SystemInformation.VerticalScrollBarWidth + 1;310                             barV.Scroll += barV_Scroll;311                             m_lstVCache[control] = barV;312                             if (blnHasHScrollbar)313                             {314                                 barV.Height = control.Height - barV.Width;315                             }316                             else317                             {318                                 barV.Height = control.Height;319                             }320                             SetVMaxNum(control);321                             barV.Location = new System.Drawing.Point(control.Right - barV.Width, control.Top);322                             control.Parent.Controls.Add(barV);323                             int intControlIndex = control.Parent.Controls.GetChildIndex(control);324                             control.Parent.Controls.SetChildIndex(barV, intControlIndex);325                         }326                     }327                     else328                     {329                         if (blnHasHScrollbar)330                         {331                             m_lstVCache[control].Height = control.Height - m_lstVCache[control].Width;332                         }333                         else334                         {335                             m_lstVCache[control].Height = control.Height;336                         }337                         SetVMaxNum(control);338                     }339                 }340                 else341                 {342                     if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null)343                     {344                         m_lstVCache[control].Visible = false;345                     }346                 }347 348                 if (blnHasHScrollbar)349                 {350                     if (!m_lstHCache.ContainsKey(control))351                     {352                         if (control.Parent != null)353                         {354                             UCHScrollbar barH = new UCHScrollbar();355                             barH.Height = SystemInformation.HorizontalScrollBarHeight + 1;356                             barH.SmallChange = 5;357 358                             barH.Scroll += barH_Scroll;359                             m_lstHCache[control] = barH;360                             if (blnHasHScrollbar)361                             {362                                 barH.Width = control.Width - barH.Height;363                             }364                             else365                             {366                                 barH.Width = control.Width;367                             }368                             SetHMaxNum(control);369                             barH.Location = new System.Drawing.Point(control.Left, control.Bottom - barH.Height);370                             control.Parent.Controls.Add(barH);371                             int intControlIndex = control.Parent.Controls.GetChildIndex(control);372                             control.Parent.Controls.SetChildIndex(barH, intControlIndex);373                         }374                     }375                     else376                     {377                         if (blnHasHScrollbar)378                         {379                             m_lstHCache[control].Width = control.Width - m_lstHCache[control].Height;380                         }381                         else382                         {383                             m_lstHCache[control].Width = control.Width;384                         }385                         SetHMaxNum(control);386                     }387                 }388                 else389                 {390                     if (m_lstHCache.ContainsKey(control))391                     {392                         if (m_lstHCache[control].Visible && m_lstHCache[control].Parent != null)393                         {394                             m_lstHCache[control].Visible = false;395                         }396                     }397                 }398             }399             ResetScrollLocation(sender);400         }401 402 403         private void SetVMaxNum(Control control)404         {405             if (!m_lstVCache.ContainsKey(control))406                 return;407             var intoV = ControlHelper.GetVScrollBarInfo(control.Handle);408             UCVScrollbar barV = m_lstVCache[control];409             if (control is ScrollableControl)410             {411                 barV.Maximum = intoV.ScrollMax;412                 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;413                 barV.Value = intoV.nPos;414                 barV.BringToFront();415                 // barV.Maximum = (control as ScrollableControl).VerticalScroll.Maximum;416                 // barV.Value = (control as ScrollableControl).VerticalScroll.Value;417             }418             else if (control is TreeView)419             {420                 var tv = control as TreeView;421                 barV.Maximum = intoV.ScrollMax * tv.ItemHeight;422                 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;423                 barV.Value = intoV.nPos * tv.ItemHeight;424                 barV.BringToFront();425 426                 //barV.Maximum = GetTreeNodeMaxY(control as TreeView) - control.Height;427                 //barV.Value = (control as TreeView).AutoScrollOffset.Y;428             }429             else if (control is TextBox)430             {431                 TextBox txt = (TextBox)control;432                 barV.Maximum = intoV.ScrollMax * txt.PreferredHeight;433                 if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Vertical)434                 {435                     barV.Visible = true;436                 }437                 else438                 {439                     barV.Visible = false;440                 }441                 barV.Value = intoV.nPos * txt.PreferredHeight;442                 barV.BringToFront();443             }444             else if (control is RichTextBox)445             {446                 bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;447                 barV.Maximum = intoV.ScrollMax;448                 barV.Visible = blnHasVScrollbar;449                 barV.Value = intoV.nPos;450                 barV.BringToFront();451             }452             else if (control is ListBox)453             {454                 var lb = control as ListBox;455                 if (intoV.ScrollMax <= 1)456                 {457                     var v = lb.ItemHeight * lb.Items.Count - lb.Height;458                     if (v > 0)459                         barV.Maximum = v;460                     else461                         barV.Maximum = intoV.ScrollMax * lb.ItemHeight;462                 }463                 else464                 {465                     barV.Maximum = intoV.ScrollMax * lb.ItemHeight;466                 }467                 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;468                 barV.Value = intoV.nPos * lb.ItemHeight;469                 barV.BringToFront();470             }471             else if (control is ListView)472             {473                 barV.Maximum = intoV.ScrollMax;474                 barV.Visible = intoV.ScrollMax > 0 && intoV.nMax > 0 && intoV.nPage > 0;475                 barV.Value = intoV.nPos;476                 barV.BringToFront();477             }478             else if (control is DataGridView)479             {480                 bool blnHasVScrollbar = false;481                 var dgv = (DataGridView)control;482                 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)483                 {484                     int _height = dgv.RowTemplate.Height * dgv.Rows.Count;485                     if (dgv.ColumnHeadersVisible)486                     {487                         _height += dgv.ColumnHeadersHeight;488                     }489                     blnHasVScrollbar = _height > dgv.Height;490                 }491                 barV.Maximum = dgv.Rows.Count;492                 barV.Visible = blnHasVScrollbar;493                 barV.Value = dgv.FirstDisplayedScrollingRowIndex; ;494                 barV.BringToFront();495             }496         }497         private void SetHMaxNum(Control control)498         {499             if (!m_lstHCache.ContainsKey(control))500                 return;501             var intoH = ControlHelper.GetHScrollBarInfo(control.Handle);502             UCHScrollbar barH = m_lstHCache[control];503             if (control is ScrollableControl)504             {505                 barH.Maximum = intoH.ScrollMax;506                 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;507                 barH.Value = intoH.nPos;508                 barH.BringToFront();509 510                 //barH.Maximum = (control as ScrollableControl).HorizontalScroll.Maximum;511                 //barH.Value = (control as ScrollableControl).HorizontalScroll.Value;512             }513             else if (control is TreeView)514             {515                 var tv = control as TreeView;516                 barH.Maximum = intoH.ScrollMax;517                 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;518                 barH.Value = intoH.nPos;519                 barH.BringToFront();520                 //barH.Maximum = GetTreeNodeMaxX(control as TreeView);521                 //barH.Value = (control as TreeView).AutoScrollOffset.X;522             }523             else if (control is TextBox)524             {525                 TextBox txt = (TextBox)control;526                 barH.Maximum = intoH.ScrollMax;527 528                 if (txt.ScrollBars == ScrollBars.Both || txt.ScrollBars == ScrollBars.Horizontal)529                 {530                     barH.Visible = true;531                 }532                 else533                 {534                     barH.Visible = false;535                 }536 537                 barH.Value = intoH.nPos;538                 barH.BringToFront();539             }540             else if (control is RichTextBox)541             {542                 bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;543 544                 barH.Maximum = intoH.ScrollMax;545                 barH.Visible = blnHasHScrollbar;546                 barH.Value = intoH.nPos;547                 barH.BringToFront();548             }549             else if (control is ListBox)550             {551                 var lb = control as ListBox;552                 barH.Maximum = intoH.ScrollMax * lb.ItemHeight;553                 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;554                 barH.Value = intoH.nPos * lb.ItemHeight;555                 barH.BringToFront();556             }557             else if (control is ListView)558             {559                 barH.Maximum = intoH.ScrollMax;560                 barH.Visible = intoH.ScrollMax > 0 && intoH.nMax > 0 && intoH.nPage > 0;561                 barH.Value = intoH.nPos;562                 barH.BringToFront();563             }564             else if (control is DataGridView)565             {566                 bool blnHasHScrollbar = false;567                 var dgv = (DataGridView)control;568                 int _width = 0;569                 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)570                 {571                     foreach (DataGridViewColumn com in dgv.Columns)572                     {573                         _width += com.Width;574                     }575                     if (dgv.RowHeadersVisible)576                     {577                         _width += dgv.RowHeadersWidth;578                     }579                     blnHasHScrollbar = _width > dgv.Width;580                 }581                 if (blnHasHScrollbar)582                     barH.Maximum = _width - dgv.Width;583                 barH.Visible = blnHasHScrollbar;584                 barH.Value = dgv.FirstDisplayedScrollingColumnHiddenWidth;585                 barH.BringToFront();586             }587         }588         /// 589         /// Resets the v scroll location.590         /// 591         /// The sender.592         private void ResetScrollLocation(object sender)593         {594             Control control = (Control)sender;595             bool blnHasVScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & VSCROLL) != 0;596             bool blnHasHScrollbar = control.IsHandleCreated && (ControlHelper.GetWindowLong(control.Handle, STYLE) & HSCROLL) != 0;597             if (control is TextBox)598             {599                 var txt = (TextBox)control;600                 if (txt.ScrollBars == ScrollBars.Both)601                 {602                     blnHasVScrollbar = true;603                     blnHasHScrollbar = true;604                 }605                 else if (txt.ScrollBars == ScrollBars.Vertical)606                 {607                     blnHasVScrollbar = true;608                     blnHasHScrollbar = false;609                 }610                 else if (txt.ScrollBars == ScrollBars.Horizontal)611                 {612                     blnHasVScrollbar = false;613                     blnHasHScrollbar = true;614                 }615                 else616                 {617                     blnHasVScrollbar = false;618                     blnHasHScrollbar = false;619                 }620             }621             else if (control is DataGridView)622             {623                 var dgv = (DataGridView)control;624                 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Vertical)625                 {626                     int _height = dgv.RowTemplate.Height * dgv.Rows.Count;627                     if (dgv.ColumnHeadersVisible)628                     {629                         _height += dgv.ColumnHeadersHeight;630                     }631                     blnHasVScrollbar = _height > dgv.Height;632                 }633                 if (dgv.ScrollBars == ScrollBars.Both || dgv.ScrollBars == ScrollBars.Horizontal)634                 {635                     int _width = 0;636                     foreach (DataGridViewColumn com in dgv.Columns)637                     {638                         _width += com.Width;639                     }640                     if (dgv.RowHeadersVisible)641                     {642                         _width += dgv.RowHeadersWidth;643                     }644                     blnHasHScrollbar = _width > dgv.Width;645                 }646             }647             else if (control is ListView)648             {649                 if (!((ListView)control).Scrollable)650                 {651                     blnHasVScrollbar = false;652                     blnHasHScrollbar = false;653                 }654             }655             if (control.Visible)656             {657                 if (m_lstVCache.ContainsKey(control))658                 {659                     m_lstVCache[control].Location = new System.Drawing.Point(control.Right - m_lstVCache[control].Width, control.Top);660                     if (blnHasHScrollbar)661                     {662                         m_lstVCache[control].Height = control.Height - m_lstHCache[control].Height;663                     }664                     else665                     {666                         m_lstVCache[control].Height = control.Height;667                     }668                     SetVMaxNum(control);669                 }670 671                 if (m_lstHCache.ContainsKey(control))672                 {673                     m_lstHCache[control].Location = new System.Drawing.Point(control.Left, control.Bottom - m_lstHCache[control].Height);674                     //if (blnHasVScrollbar)675                     //{676                     //    m_lstHCache[control].Width = control.Width - m_lstVCache[control].Width;677                     //}678                     //else679                     //{680                     m_lstHCache[control].Width = control.Width;681                     //}682                     SetHMaxNum(control);683                 }684             }685         }686 687         /// 688         /// Handles the VisibleChanged event of the control control.689         /// 690         /// The source of the event.691         /// The  instance containing the event data.692         void control_VisibleChanged(object sender, EventArgs e)693         {694             Control control = (Control)sender;695 696             if (m_lstVCache.ContainsKey(control) && m_lstVCache[control].Parent != null)697             {698                 m_lstVCache[control].Visible = control.Visible;699             }700 701             if (m_lstHCache.ContainsKey(control) && m_lstHCache[control].Parent != null)702             {703                 m_lstHCache[control].Visible = control.Visible;704             }705             if (control.Visible)706             {707                 control_SizeChanged(control, null);708             }709         }710 711         private const int HSCROLL = 0x100000;712         private const int VSCROLL = 0x200000;713         private const int STYLE = -16;714 715         private Dictionarym_lstVCache = new Dictionary();716         private Dictionarym_lstHCache = new Dictionary();717 718         void barV_Scroll(object sender, EventArgs e)719         {720             UCVScrollbar bar = (UCVScrollbar)sender;721             if (m_lstVCache.ContainsValue(bar))722             {723                 Control c = m_lstVCache.FirstOrDefault(p => p.Value == bar).Key;724 725                 //ControlHelper.SetVScrollValue(c.Handle, bar.Value);726                 if (c is ScrollableControl)727                 {728                     (c as ScrollableControl).AutoScrollPosition = new Point((c as ScrollableControl).AutoScrollPosition.X, bar.Value);729                 }730                 else if (c is TreeView)731                 {732                     ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TreeView).ItemHeight));733                 }734                 else if (c is TextBox)735                 {736                     ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as TextBox).PreferredHeight));737                 }738                 else if (c is RichTextBox)739                 {740                     ControlHelper.SetVScrollValue(c.Handle, bar.Value);741                 }742                 else if (c is ListBox)743                 {744                     ControlHelper.SetVScrollValue(c.Handle, bar.Value / ((c as ListBox).ItemHeight));745                 }746                 else if (c is ListView)747                 {748                     ControlHelper.SetVScrollValue(c.Handle, bar.Value);749                 }750                 else if (c is DataGridView)751                 {752                     var dgv = (DataGridView)c;753                     if(bar.Value>0)754                     dgv.FirstDisplayedScrollingRowIndex = bar.Value - 1;755                 }756             }757         }758 759         void barH_Scroll(object sender, EventArgs e)760         {761             UCHScrollbar bar = (UCHScrollbar)sender;762             if (m_lstHCache.ContainsValue(bar))763             {764                 Control c = m_lstHCache.FirstOrDefault(p => p.Value == bar).Key;765                 if (c is ScrollableControl)766                 {767                     (c as ScrollableControl).AutoScrollPosition = new Point(bar.Value, (c as ScrollableControl).AutoScrollPosition.Y);768                 }769                 else if (c is TreeView)770                 {771                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);772                     //TreeView tv = (c as TreeView);773                     //SetTreeViewVScrollLocation(tv, tv.Nodes, bar.Value);774                 }775                 else if (c is TextBox)776                 {777                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);778                     //TextBox txt = (c as TextBox);779                     //SetTextBoxVScrollLocation(txt, bar.Value);780                 }781                 else if (c is RichTextBox)782                 {783                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);784                 }785                 else if (c is ListBox)786                 {787                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);788                 }789                 else if (c is ListView)790                 {791                     ControlHelper.SetHScrollValue(c.Handle, bar.Value);792                 }793                 else if (c is DataGridView)794                 {795                     var dgv = (DataGridView)c;796                     dgv.HorizontalScrollingOffset = bar.Value;797                 }798             }799         }800 801         #region Treeview处理    English:Treeview\u5904\u7406802         void tv_AfterCollapse(object sender, TreeViewEventArgs e)803         {804             control_SizeChanged(sender as Control, null);805         }806 807         void tv_AfterExpand(object sender, TreeViewEventArgs e)808         {809             control_SizeChanged(sender as Control, null);810         }811 812         #endregion813 814         #region TextBox处理    English:TextBox Processing815 816         void txt_TextChanged(object sender, EventArgs e)817         {818             Control txt = sender as Control;819             control_SizeChanged(txt, null);820         }821 822         void txt_KeyDown(object sender, KeyEventArgs e)823         {824             Control txt = sender as Control;825             control_SizeChanged(txt, null);826         }827         #endregion828     }829 }

View Code