C# Panel 中加入 hScrollBar

 

需求: 要在 Panel 动态的放置多个 Button, 而且是一字排开, 不换行,  Panel 的宽度固定的, 所以 Button 特别多时, 就需要有滚动条, 由于某种原因, Panel 的 AutoScroll 要设为 false

解决:
因为不能使用 Panel 自带的 Scroll 功能, 所以需要加个 HScrollBar, 并且要在设置其 OnScroll 事件

具体代码如下: 一个自定义控件, 继承了 Panel, 添加 Button 时,调用 AddControl

  List<Button> btnList; private int i = 0; private int btnWidth = 40; public void AddControl( Button ctl) { ctl.Height = this.Height; ctl.Width = btnWidth; this.Controls.Add(ctl); i++; btnList.Add(ctl); this.hScrollBar.Maximum = i; SetScrollBarVisible(); SetControlsVisible(hScrollBar.Value); } protected override void OnResize(EventArgs e) { base.OnResize(e); hScrollBar.Left = this.Width - hScrollBar.Width; SetScrollBarVisible(); } private void SetScrollBarVisible() { if (hScrollBar.Value != 0) { hScrollBar.Visible = true; return; } if (i * (btnWidth + 2) > hScrollBar.Left) { hScrollBar.Visible = true; } else { hScrollBar.Visible = false; } } private void hScrollBar1_Scroll(object sender, ScrollEventArgs e) { int currValue = e.NewValue; SetControlsVisible(currValue); } private void SetControlsVisible(int currValue) { if (!hScrollBar.Visible) { for (int i = 0, sz = btnList.Count; i < sz; i++) { btnList[i].Visible = true; btnList[i].Left = (i ) * (btnWidth + 2); } return; } for (int i = 0; i < currValue; i++) { btnList[i].Visible = false; } for (int i = currValue, sz = btnList.Count; i < sz; i++) { btnList[i].Visible = true; btnList[i].Left = (i - currValue) * (btnWidth + 2); } }

你可能感兴趣的:(object,C#,button,scroll)