多个TrackBar控件联动设置百分比

来源:互联网 发布:特大城市xl mac 编辑:程序博客网 时间:2024/06/05 09:15

http://blog.csdn.net/luols/article/details/22782929


我们有时候需要设计一个比重设置,当然几个比重合计之和肯定要100%,就这么一个简单的需求,换成是你,你会如何设计?个数不确定,另一个则是要保证100%。设计这样的方案困扰了我好几天,最开始设计了几个下拉框,但因操作不方便被痛批好几次,我不知道有没现成的资源可用,山穷水尽后想到TrackBar控件,虽然不能说这是最好的,但起码操作起来还算方便,多个TrackBar联动控制最大的难点在于如何保证几个TrackBar的值之和为100%
我的思路是这样:滑动前面的滑块会对后面的几个产生影响,而且后面几个的值只能平均分配;但当滑动后面的滑块则对前面的没有任何影响,否则将陷入“死循环”,不多说了,先上最终效果图

我这里设计了一个UserControl,里面放置三个控件:GroupBox/Label/TrackBar,Label用来显示当前百分比,GroupBox用来显示标签,外部可以通过这个标签来获取当前的百分比,下面是UserControl源代码

[csharp] view plain copy print?
  1. public partial class UserControl1 : UserControl  
  2. {  
  3.     /// <summary>  
  4.     /// 标签  
  5.     /// </summary>  
  6.     public string UCName  
  7.     {  
  8.         get { return groupBox1.Text; }  
  9.         set { groupBox1.Text = value; }  
  10.     }  
  11.     /// <summary>  
  12.     /// 刻度值  
  13.     /// </summary>  
  14.     public int TickValue  
  15.     {  
  16.         get { return trackBar1.Value; }  
  17.         set {   
  18.             trackBar1.Value = value;  
  19.             label1.Text = string.Format("{0}%", trackBar1.Value);  
  20.         }  
  21.     }  
  22.   
  23.     //声明事件委托    
  24.     public delegate void MyScrollHandler(object sender);  
  25.     //定义事件    
  26.     public event MyScrollHandler OnTrackBar_Scroll;  
  27.   
  28.     public UserControl1()  
  29.     {  
  30.         InitializeComponent();  
  31.         label1.Text = string.Format("{0}%", trackBar1.Value);  
  32.     }  
  33.   
  34.     private void trackBar1_Scroll(object sender, EventArgs e)  
  35.     {  
  36.         if (OnTrackBar_Scroll != null)  
  37.         {  
  38.             OnTrackBar_Scroll(this);  
  39.             label1.Text = string.Format("{0}%", trackBar1.Value);  
  40.         }  
  41.     }  
  42. }  
主界面源代码
[csharp] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. /// <summary>  
  2. /// TrackBar数量  
  3. /// </summary>  
  4. int tbCount = 4;  
  5.   
  6. public Form1()  
  7. {  
  8.     InitializeComponent();  
  9. }  
  10.   
  11. protected override void OnLoad(EventArgs e)  
  12. {  
  13.     base.OnLoad(e);  
  14.   
  15.     ArrayList al = new ArrayList();  
  16.     for (int i = 1; i <= tbCount; i++)  
  17.     {  
  18.         UserControl1 uc = new UserControl1();  
  19.         uc.UCName = "TrackBar" + i;  
  20.         uc.TickValue = 100 / tbCount; //默认平均数  
  21.         uc.Tag = i; //标识第几个  
  22.         uc.Dock = DockStyle.Top;  
  23.         uc.OnTrackBar_Scroll += new UserControl1.MyScrollHandler(uc_OnTrackBar_Scroll);  
  24.         al.Add(uc);  
  25.     }  
  26.     al.Reverse(); //反序使得UC按标识顺序添加到容器上  
  27.     foreach (UserControl1 uc in al)  
  28.     {  
  29.         this.panel1.Controls.Add(uc);  
  30.     }  
  31. }  
  32. /// <summary>  
  33. /// 滑块联动控制(核心)  
  34. /// </summary>  
  35. /// <param name="sender"></param>  
  36. private void uc_OnTrackBar_Scroll(object sender)  
  37. {  
  38.     int leftPct = 100;  
  39.     UserControl1 uc = sender as UserControl1;  
  40.     int tag = Convert.ToInt32(uc.Tag);  
  41.     for (int i = 0; i < tbCount; i++)  
  42.     {  
  43.         UserControl1 ucc = this.panel1.Controls[(tbCount - 1) - i] as UserControl1;  
  44.         int t = Convert.ToInt32(ucc.Tag);  
  45.         if (t > tag) //后面几个的百分比平均分配  
  46.         {  
  47.             ucc.TickValue = leftPct / (tbCount - tag);  
  48.         }  
  49.         else //获取剩余百分比  
  50.         {  
  51.             leftPct -= ucc.TickValue;  
  52.             if (leftPct <= 0 && t == tag) //当前滑块,控制剩余百分比不小于0  
  53.             {  
  54.                 ucc.TickValue += leftPct;  
  55.                 leftPct = 0;  
  56.             }  
  57.         }  
  58.     }  
  59. }  


这个肯定还有很多不足之处,但请各位路过的朋友不吝赐教...

0 0
原创粉丝点击