沐枫小筑

script c c++ c++/cli c#
.net windows ria game and so ...

  博客园 :: 首页 :: 联系 :: 订阅 订阅 :: 管理
  53 Posts :: 1 Stories :: 381 Comments :: 8 Trackbacks

        我们经常需要控制窗口控件的状态。比如,在某些情况下,需要禁止一部份控件,或让一部份控件呈只读状态等等。
        假如有如下的窗口:
       

        当按下Enable时,左侧的所有控件都要禁止(Enabled=false),当按下Disable时,左侧的所有控件都取消禁止(Enabled=true)。
        通常的作法是直接用代码来控制:    

        private void EnableOrDisable(bool isEnabled)
        
{
            
this.button1.Enabled = isEnabled;
            
this.checkBox1.Enabled = isEnabled;
            
this.comboBox1.Enabled = isEnabled;
            
this.textBox1.Enabled = isEnabled;
        }


        
private void btnEnable_Click(object sender, EventArgs e)
        
{
            EnableOrDisable(
true);
        }


        
private void btnDisable_Click(object sender, EventArgs e)
        
{
            EnableOrDisable(
false);
        }


        这样的作法,在一些简单的逻辑控制倒也行的通。但是一旦控件的数量比较多,而控制逻辑也比较复杂的时候,类似EnableOrDisable的函数将会变得很多,而且很复杂、不直观。
        本文介绍一种方法,可以在RAD可视化设计界面中直接指定控件的状态,并只用很简单的代码来切换状态。

.NET20 一种简单的窗口控件UI状态控制方法    沐枫网志

        首先,定义一个类UiState,类中只有一个属性“IsEnabled”,用于指定当前控件的禁止状态:

    class UiState
    
{
        
private bool isEnabled;

        
public bool IsEnabled
        
{
            
get return isEnabled; }
            
set { isEnabled = value; }
        }
 
    }



        然后编译。必须编译一次,否则RAD界面不知道有这个类存在。
        接下来,到DataSources侧栏中点“增加新数据源”,并在向导中选择“Object”,按下一步:

 

        选择“UiState”,按“Finish”:

 

        再回到窗口的设计界面,依次设置需要改变状态的控件。
        如下图,选中某个控件,到属性页中,展开(DataBindings),启动(Advanced)设置窗口,选择“Enabled”属性,并在Binding中选择“uiStateBindingSource - IsEnabled”。
 

        如下图,可以在设计窗口检查绑定状态:

 

        最后增加Enable和Disable按钮的处理函数: 

        private UiState uiState = new UiState();

        
public Form1()  // 构造函数
        {
            InitializeComponent();
            uiStateBindingSource.DataSource 
= uiState; // 必须!!!
        }


        
private void EnableOrDisable(bool state)
        
{
            uiState.IsEnabled 
= state;
            uiStateBindingSource.ResetCurrentItem();
        }

        
private void btnEnable_Click(object sender, EventArgs e)
        
{
            EnableOrDisable(
true);
        }


        
private void btnDisable_Click(object sender, EventArgs e)
        
{
            EnableOrDisable(
false);
        }

 

        运行,测试OK:
  
 
        总结:
        对于简单的控制逻辑来说,硬编码的方式比较适合。
        但对于稍微复杂一些的控制逻辑来说,还是这种方式比较适用。因为这种方式比较灵活,并且可以直观的在设计界面上进行修改,代码也显得简洁,可读性强。
        遗憾的是,菜单项和工具栏项不是可绑定的,所以本文介绍的方式无效。而通常使用中,菜单和工具栏偏偏又是控制逻辑最复杂的。唯一的办法,只能是自定义一个Actions控件,并采用本文类似的逻辑,通过Reflection机制对菜单项和工具栏进行绑定。Delphi的Actions控件就做的相当不错。

posted on 2005-11-03 12:12 沐枫 阅读(2706) 评论(8)  编辑 收藏 所属分类: Tip#

Feedback

#1楼  2005-11-03 14:23 age0 [未注册用户]
这种方法真的很无聊,只要写一个类再写几行代码就可以解决问题,何必在UI设计器上捣来捣去。

Controls cs = new Controls();

cs.Add(button1);
cs.Add(checkBox1);
cs.Add(comboBox1);
cs.Add(textBox1);

cs.EnableAll();
cs.DisableAll();


  回复  引用    

#2楼  2005-11-03 14:59 比 [未注册用户]
Controls cs = new Controls(); 这无法识别
  回复  引用    

#3楼 [楼主] 2005-11-03 15:01 沐枫      
@age0
你的方法不错。受教了。
我写这些,不过是抛砖引玉罢了。

但是假如需要改变的属性不只是Enabled,同时还有其它属性如ReadOnly等等,也可能一个控件的几个属性同时改,你的方法就不是很方便了,而且,在UI设计器上根本看不出来。
  回复  引用  查看    

#4楼  2005-11-03 15:25 age0 [未注册用户]
微软确实是在UI设计器上下了很多功夫,提供了不少貌似强大的功能,但在很多情况下,这些功能无异于鸡肋。

就比如说这个Controls类,我们不但可以提供Eanble或Disable方法,还可以按需增加SetBackColor、SetReadOnly、SetVisible或SetEmpty等各种方法,而且即使这些是散布在Form的不同位置,只要看到cs.Add()代码,控件之间的关系就一目了然,这些隐含的关系在UI设计器上是很难看出来的。

UI设计器用来专心排版就好了,其他数据绑定之类的最好不要去较真,否则结果只会是得不偿失。
  回复  引用    

#5楼  2005-11-03 16:08 载 [未注册用户]
Controls cs = new Controls();这句在NET 2。0中不能成立呢??指点一下吧
  回复  引用    

#6楼  2005-11-03 17:32 age0 [未注册用户]
晕死。

public class Controls
{
ArrayList m_list = new ArrayList();

public Controls()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public void Add(Control ct)
{
m_list.Add(ct);
}

public void EnableAll()
{
foreach(object o in m_list)
{
Control ct = o as Control;
if(ct == null)
continue;
ct.Enabled = true;
}
}
}
  回复  引用    

#7楼  2006-03-24 04:16 erist [未注册用户]
把一样逻辑的控件放一个panle里,一样可以实现,只要设置panel 的属性即可
  回复  引用    

#8楼  2007-12-19 00:10 Justin      
这是一种很好的尝试,谢谢
  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-09-12 16:44 编辑过


相关链接: