stonezhuzisgu的专栏

见贤思齐

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

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

        当按下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控件就做的相当不错。


来源:互连网 作者:沐枫网志
阅读更多
个人分类: dotNetFramework
上一篇网上收集的asp.net常用js,感谢挖井人
下一篇ASP.NET用户控件事件的定义和实践--C#里的委托和事件实现Observer
想对作者说点什么? 我来说一句

.NET 2.0 自动更新控件-源码

2008年08月26日 317KB 下载

Unity3D GUI焦点操作

2013年06月04日 201B 下载

窗口手术师

2007年04月30日 238KB 下载

WPF 使用线程更新UI

2014年11月30日 61KB 下载

form登陆窗口

2013年05月28日 416KB 下载

MFC UI控件布局 自动调整

2014年10月24日 940KB 下载

vc多线程通过消息控制窗口控件

2012年12月14日 3.48MB 下载

没有更多推荐了,返回首页

关闭
关闭