(3)使用公共属性
使用公共属性也是一种比较常用的方式,通过窗体设计器添加的控件默认访问修饰符为private级别,可以设置成public或Internal(在程序集内部可见)来对外公开。比如对窗体中的Button进行公开,那就可以访问Button的相关属性,同时也可以注册事件或撤销事件注册。如,
OptionForm form = new OptionForm();
form.buttonOK.Click += new EventHandler(buttonOK_Click);
form.ShowDialog();
对于只允许读取访问或修改访问的控件或变量可以通过属性来控制。对(1)方式进行修改,去除重载构造函数,增加属性也可以实现同样的效果。
public object MyParams
{
get { return this.myParams; }
set { this.myParams = value; }
}
(4)使用公共方法
使用公共方法类似于属性,对上面的同等实现如下,
//获取参数
public object GetParams()
{
return this.myParams;
}
//设置参数
public void SetParams(object myParams )
{
this.myParams = myParams;
}
(5)使用静态类该方式可以简单的理解为静态变量全局共享,通过下面代码能够比较清楚的理解,先来定义静态类,
public static class ParameterSettings
{
//公共静态变量
public static string Username = "Zhengzuo";
//私有静态变量
private static string userRole = "Administrators";
//私有静态变量
private static string password = "http://blog.csdn.net/zhzuo";
//内部属性
internal static string UserRole
{
get { return userRole; }
}
//公共属性
public static string Password
{
get { return password; }
private set { password = value; }
}
}
在需要访问的地方通过以下方式进行,
string username = ParameterSettings.Username;
string password = ParameterSettings.Password;
string userRole = ParameterSettings.UserRole;
ParameterSettings.Username = "郑佐";//修改成新用户名
(6)窗体实现Singleton模式
Singleton模式是我们开发过程中最常用的模式之一。在技术社区经常看到有人谈及对主窗体实现Singleton,但个人认为这不是一种妥当的做法,因为没有这个必要。这里通过另一个自定义类来进行演示。假设UserLoginInfo类用来保存登录系统后的用户凭据。
/*==============================================
程序 郑佐 2006-4-23 http://blog.csdn.net/zhzuo
==============================================*/
public class UserLoginInfo
{
//实现Singleton模式,线程安全。
private readonly static UserLoginInfo currentUserInfo = new UserLoginInfo();
//提供全局访问点
public static UserLoginInfo CurrentUserInfo
{
get { return currentUserInfo; }
}
//阻止显式实例化,但不能阻止反射方式调用。
private UserLoginInfo()
{
}
//公共变量
public string Username;
//私有变量
private static string userRole;
//私有变量
private static string password;
//内部属性
internal string UserRole
{
get { return userRole; }
set { userRole = value; }
}
//公共属性
public string Password
{
get { return password; }
internal set { password = value; }
}
}
在其他代码中进行访问,
UserLoginInfo.CurrentUserInfo.Username ="郑佐";
UserLoginInfo.CurrentUserInfo.UserRole = "dotnetlover";
UserLoginInfo.CurrentUserInfo.Password = "http://blog.csdn.net/zhzuo";
对于Singleton模式的实现方式有很多,编写时需要考虑是否需要保证实例访问的线程安全问题,以免引发不可预料的情况,为了提高性能可以考虑惰性实例化。关于Singleton模式的更多信息可以参考另一篇文章。
(7)发布事件进行订阅
通过事件来传递参数应该说是一种推的实现方式,在产生事件时进行被动的获取相关数据。这里将通过一个自定义事件来演示数据的传输。
在自定义事件时,标准的做法都会先定义一个事件参数类,要么直接使用基类EventArgs,或者从EventArgs继承实现自己的参数类,假设自定义基类取名为OptionSettingEventArgs,
//选项设置事件参数类
public class OptionSettingEventArgs : EventArgs
{
private string changedPath;
//构造函数
public OptionSettingEventArgs(string changedPath)
{
this.changedPath = changedPath;
}
//读取参数
public string ChangedPath
{
get { return this.changedPath; }
}
}
以上参数类只包含一个修改后的路径参数。接下去我们要对原先的OptionForm窗体增加事件定义,这里使用.net 2.0中提供的泛型类来实现。
//定义事件
public event EventHandler<OptionSettingEventArgs>
编写事件引发程序如下,
//引发OptionSettingChanged事件
protected virtual void OnOptionSettingChanged(OptionSettingEventArgs e)
{
if (OptionSettingChanged != null)
{
OptionSettingChanged(this, e);
}
}
对文件目录选择按钮事件处理程序进行修改来实现事件激发,并没有考虑直接从文本框直接数据输入方式。
//通过目录对话框设置新的路径
private void buttonBrowser_Click(object sender, EventArgs e)
{
FolderBrowserDialog dialog = new FolderBrowserDialog();
DialogResult result = dialog.ShowDialog(this);
if (result == DialogResult.OK)
{
if(this.textBoxPath.Text != dialog.SelectedPath)
{
this.textBoxPath.Text = dialog.SelectedPath;
OptionSettingEventArgs args = new OptionSettingEventArgs(dialog.SelectedPath);
OnOptionSettingChanged(args);
}
}
}

