当一个页面里有大量的按钮(最少10+),而且用户的每个操作会导致不同的按钮被启用,同时以前被启用的按钮可能随着这个操作又禁用了.
每当遇到这样的页面就头大.我现在的方法很笨,对每个事件都编写一整串的按钮状态操作代码,这样的坏处就是,每当一个页面多出几个按钮或者要删掉几个按钮,我就得到处改代码,感觉时间很大部分都浪费在这上面.
现在请教下高手有没有什么好的设计模式能用在我这情况上的,也欢迎大家讨论

解决方案 »

  1.   

    有些按钮状态要根据查询回来的数据来判断的,这些按钮怎么办还有的按钮,比如影响最简单的click事件,页面中可能不同的变量就要不同的响应,这些可不是简单的注册就能解决的
      

  2.   

    1、根本的解决这类问题需要重新设计架构,采用建模的方式,动态输出view,
    其实核心的指导思想就是:“同样的事情不要重复做n遍”;
    2、如果就事论事,以下代码仅供参考:    /// <summary>
        /// 设置按钮状态
        /// </summary>
        /// <param name="pStatus">0:不可见;1:不可用;2:可用</param>
        /// <param name="pControlId">按钮Id</param>
        private void SetButtonStatus(int pStatus,string pControlId)
        {
            int _Status = pStatus;  //校验参数,代码略 
            if(_Status < 0 || _Status > 2)
            {
                throw new Exception("参数pStatus错误,0:不可见;1:不可用;2:可用.");
            }
            string _ControlId = pControlId; //校验参数,代码略
            Control _ctr =  this.FindControl(_ControlId);
            if (_ctr == null)
            {
                throw new Exception("参数pControlId错误,控件不存在.");
            }        Button _btn = (Button)_ctr;
            _btn.Visible = (_Status > 0);
            _btn.Enabled = (_Status == 2);
        }
      

  3.   

    按照业务划分来规划按钮的位置。一块业务用div或者一个大标签来控制。这样可以用div或者一个table来控制多个按钮的显示或者隐藏,这样比单个按钮都写应该好很多。
      

  4.   

    你的按钮启用/禁用的规则是什么?可以根据你的业务规则在一个统一的方法里设置按钮的禁用/启用状态,处理事件时只要调用这个公共方法就行了。举个例子
    <asp:Button runat="server" Text="加红" Enabled='<%# MyState.HP<100% %>' />
    <asp:Button runat="server" Text="加蓝" Enabled='<%# MyState.MP<100% %>' />
    <asp:Button runat="server" Text="打怪" Enabled='<%# FindNearby("怪")>0 && 状态!="采集" />
    <asp:Button runat="server" Text="采集" Enabled='<%# FindNearby("物品")>0 && 状态!="战斗" />这样在button的事件中只要处理对应的业务逻辑,修改状态后会自动反映到界面按钮上去