废话不多说、直接正题
我写了一个自定义按钮(继承UserControl),按钮设置了一个编号属性(int型),和一个开关属性(bool型)
这个按钮需要同时显示多个、这里我们打比方说是5个、通过设置编号属性,按钮上的数字分别为1,2,3,4,5
如果双击按钮、按钮会变颜色、bool型的开关属性也会改变
但是现在需求是:当一个按钮双击(打开)的话、其他的必须强行关闭(有这个限制、其实当时最多也只有一个按钮开着)
总的来说就是:最多只能有一个按钮开着
怕说不清楚、语言叙述一个Test流程:5个按钮初始完毕,双击1号,1号开关属性从默认的false变成true(再双击1号的话、1号的开关属性会再变成false、但是现在说的是、不关1号的情况下)、再双击3号、1号开关属性变成false、3号属性变成true
说白了就是没法知道前一个操作的是哪个
也想过、每双击(打开)一个按钮时、把所有按钮遍历一遍、不论什么情况全部设为false、然后再把当前这个设为true、但是总感觉还有更好的办法、比如创建一个和全局变量效果相仿的东西。希望各位多分享宝贵思路、非常感谢

解决方案 »

  1.   

    不需要全局变量,如果按钮的事件响应在Form里面执行的话,你可以知道其他所有按钮对象,操作它们就可以,最好设计成这样,不要在按钮类里处理事件,如果你一定要用全局变量来实现,那也很容易,在按钮类里定义一个static变量,static变量看起来就像是全局变量,
      

  2.   

    winform?给窗口定义一个属性/变量,用来记录当前打开的按钮可以么?
      

  3.   

    因为按钮个数不确定、需要根据配置文件中的需求动态添加、所以按钮的事件都写在自定义控件类中给委托了。所以想获取所有按钮、我能想到的只有遍历还有一个问题,我一直感觉是不是我理解的有问题:
             比如、我在自定义按钮类中定义了一个static变量、但是按钮可能会同时显示好多、比如我点1号、static变量的值设置为1(编号属性)、但是我点2的时候、2里边的static变量值会不会还是自定义控件类中的原始值?
    毕竟每个按钮的添加都是实例化了自定义控件类、static会不会也是一个一个独立的?互不相干?
      

  4.   

    这个我也想过、因为控件是要动态添加上去的、所以事件逻辑处理必须写到自定义控件类里并委托、所以联系不到form中的东西
      

  5.   

    发代码没什么不方便、但是这个问题还没下结论、代码只写了双击改变颜色以及 根据编号属性值显示编号数字的功能
            bool bOpAndCl = false;//按钮开关,false为关,true为开
            int iJtIndex = 0;//按钮编号,从0开始,按钮上显示的数字根据此属性、不过则是从1开始
            public int JtIndex
            {
                set { iJtIndex = value; }
                get { return iJtIndex; }
            }
            public bool OpAndCl
            {
                set { bOpAndCl = value; }
                get { return bOpAndCl; }
            }
            void JtControl_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = this.CreateGraphics();
                Font font = new Font("黑体", 15, FontStyle.Bold);
                string str = string.Format("{0}", JtIndex + 1);
                SizeF sizeF = g.MeasureString(str, font);
                g.DrawString(str, font, Brushes.Black, this.Width / 2 - sizeF.Width / 2, this.Height / 2 -              sizeF.Height / 2);
             }
             public JtControl()
            {
                InitializeComponent();
                this.Paint += new PaintEventHandler(JtControl_Paint);
                this.MouseDoubleClick += new MouseEventHandler(JtControl_MouseDoubleClick);
            }
            private void JtControl_MouseDoubleClick(object sender, MouseEventArgs e)
            {
                  if(//背景色为空)
                  {
                         //背景色为红
                  }
                  else
                  {
                         //背景色还原
                  }
            }大概就是这样子、逻辑没想好怎么写
      

  6.   


     bool _bol = true;
     private void botton1_DoubleClick(object sender, EventArgs e)
            {
                //其他四个按钮的Enable=Flase;
                if (_bol)
                {
                     //开关1为true;
                }
                else
                {
                    //将1的Enable为false 3的为ture其他的不变
                    //开关1为false;
                }        
            }
             ...依次类推
      

  7.   


    static变量和全局变量一样,和实例无关,每个实例看到的static变量都是同一个对象,创建新的实例不会改变static变量的取值,如果你要初始化static变量,需要给类定义一个static构造函数,static构造函数只会调用一次,不论创建多少个实例,
      

  8.   


     public delegate void MouseDoubleClick(object sender, EventArgs e);
     public event MouseDoubleClick Button_MouseDoubleClick;
     private void JtControl_MouseDoubleClick(object sender, EventArgs e)
     {
                if (Button_MouseDoubleClick != null)
                    Button_MouseDoubleClick(sender, e);
     }//这样,你可以把控件的双击事件弄成事件,在form里面调用处理
    int openindex=-1;
    List<JtControl> jtlist;按钮集合
    for(int i=0;i<jtlist.Count;i++)
    {
    jtlist[i].Button_MouseDoubleClick+=new System.EventHandler(MouseDoubleClick);
    } private void MouseDoubleClick(object sender, EventArgs e)
      {
         JtControl jt =sender as JtControl ;
         jtlist[openindex].bOpAndCl =false;
         jt.bOpAndCl =true;
         openindex=jt.iJtIndex 
            if(//背景色为空)
                  {
                         //背景色为红
                  }
                  else
                  {
                         //背景色还原
                  }
       
      }        
      

  9.   

    额,估计我那段代码就是这个意思了...前面部分的注册事件,然后 JtControl jt =sender as JtControl ;判断来源jtlist[openindex].bOpAndCl =false;
         jt.bOpAndCl =true;
         openindex=jt.iJtIndex 
    执行对应状态
      

  10.   

    嗯,不过只有sender那里不懂、每一步是干什么可以看懂、嘿嘿看看sender去、多谢了老兄
      

  11.   

    sender记录是到底是谁执行了这个事件