()){Console.WriteLine(\"{0} ({1}) - {2}\", setting.DisplayName, setting.Description, setting.DefaultValue);}
2、参数配置功能界⾯截图
基于上述的SettingsProvider.net的组件,我们可以结合我前⾯介绍的FireFoxDialog界⾯效果,实现较好的参数配置管理功能,如下界⾯所⽰。
我们可以分别把不同的参数放到不同的存储介质⾥⾯去,如⼀些常⽤的,可以配置到本地⽬录⽂件⾥⾯去,⼀些和个⼈信息相关的内容,我
们可以把它放到数据库⾥⾯去,这样可以在各个客户端使⽤都不需要重新配置,⾮常⽅便。
上⾯的例⼦,我针对性介绍两个,⼀个是基于本地⽂件参数存储,⼀个是基于数据库⽂件的参数存储。
3、基于SettingsProvider.net的整合操作的实现
介绍了基于SettingsProvider.net的功能,以及最终整合的效果,我们来看看它具体是如何整合实现不同⽂件类型数据的保存的。
⾸先,我们在设计模式下,拖动好对应的界⾯,由于FireFoxDialog界⾯本来就是⽤来做参数设置的,因此他们⾥⾯有⼀些控件就不⼀⼀介绍了,具体可以参考对应的⽂章(http://www.codeproject.com/KB/miscctrl/ControlFirefoxDialog.aspx?msg=18549)。我们看看上述效果界⾯的设计界⾯和后台代码。
设计界⾯就是如下所⽰,拖动⼀个参数配置⽤户控件到窗体上,设置好对应的内容就可以了。后台代码如下所⽰。
public partial class FrmSettings : BaseForm {
public FrmSettings() {
InitializeComponent(); }
private void FrmSettings_Load(object sender, EventArgs e) {
this.firefoxDialog1.ImageList = this.imageList1;
this.firefoxDialog1.AddPage(\"报表设置\", new PageReport());//基于本地⽂件的参数存储 this.firefoxDialog1.AddPage(\"邮箱设置\", new PageEmail());//基于数据库的参数存储 //下⾯是陪衬的
this.firefoxDialog1.AddPage(\"短信设置\", new PageEmail()); this.firefoxDialog1.AddPage(\"声⾳设置\", new PageEmail()); this.firefoxDialog1.AddPage(\"系统设置\", new PageEmail()); this.firefoxDialog1.AddPage(\"备份设置\", new PageEmail()); this.firefoxDialog1.AddPage(\"其他设置\", new PageEmail()); this.firefoxDialog1.Init(); } }
这⾥最有代表性的是PageReport和PageEmail两个组件对象。1)报表模块配置管理
基于报表参数和邮件参数,我们可以定义⼀个参数对象类,⽤来⽅便保存和获取数据的承载对象。报表参数对象类如下(只做了简单的⼀个报表路径处理):
/// /// 报表设置 ///
public class ReportParameter {
/// /// 派车单报表⽂件 ///
[DefaultValue(\"WHC.CarDispatch.CarSendBill2.rdlc\")] public string CarSendReportFile { get; set; } }
对应的设计界⾯如下所⽰,⽤来提供⼀个报表⽂件的参数配置,很简单了。我们来看看后台的组件,对参数是如何保存和显⽰的。
⾸先需要初始化相应的对象,我们这⾥使⽤了在程序运⾏⽬录下,创建⼀个⽂件⽤来保存这些设置。
public partial class PageReport : PropertyPage {
private SettingsProvider settings; private ISettingsStorage store; public PageReport() {
InitializeComponent();
if(!this.DesignMode) {
// PortableStorage: 在运⾏程序⽬录创建⼀个setting的⽂件记录参数数据 store = new PortableStorage();
settings = new SettingsProvider(store); } }
注意:PortableStorage是在运⾏程序⽬录创建⼀个setting的⽂件记录参数数据,运⾏后,最终会在⽬录下⽣成⼀个类似“ReportParameter.settings”的⽂件,它的内容格式如下所⽰。
[{\"Key\":\"CarSendReportFile\
我们看看报表组件的参数是如何初始化的:
public override void OnInit() {
ReportParameter parameter = settings.GetSettings(); if (parameter != null) {EnableOtherReport(false);
string reportFile = parameter.CarSendReportFile;
if (reportFile == \"WHC.CarDispatch.CarSendBill2.rdlc\") {
this.radReport.SelectedIndex = 0; }
else if (reportFile == \"WHC.CarDispatch.CarSendBill.rdlc\") {
this.radReport.SelectedIndex = 1; } else {
EnableOtherReport(true);
this.radReport.SelectedIndex = 2; this.txtOtherReport.Text = reportFile; } } }
通过参数的存储对象处理,这样我们就可以通过ReportParameter 进⾏数据获取了。
保存参数的时候,同样也是先获取到⼀个参数对象,并设置它的值后,然后进⾏保存就可以了,具体代码如下所⽰。
public override bool OnApply() {
bool result = false; try {
ReportParameter parameter = settings.GetSettings(); if (parameter != null) {int otherType = 2;//2代表其他类型
if (this.radReport.SelectedIndex < otherType) {
parameter.CarSendReportFile = this.radReport.Properties.Items[this.radReport.SelectedIndex].Value.ToString(); } else {
parameter.CarSendReportFile = this.txtOtherReport.Text; }
settings.SaveSettings(parameter); }result = true; }
catch (Exception ex) {
LogTextHelper.Error(ex);
MessageDxUtil.ShowError(ex.Message); }
return result; }
2)邮件参数配置管理 邮件参数对象类如下:
/// /// 邮箱设置///
public class EmailParameter {
/// /// 邮件账号 ///
//[DefaultValue(\"wuhuacong@163.com\")] public string Email { get; set; } /// /// POP3服务器 ///
[DefaultValue(\"pop.163.com\")]
public string Pop3Server { get; set; } /// /// POP3端⼝ /// [DefaultValue(110)]
public int Pop3Port { get; set; } /// /// SMTP服务器 ///
[DefaultValue(\"smtp.163.com\")]
public string SmtpServer { get; set; } /// /// SMTP端⼝ /// [DefaultValue(25)]
public int SmtpPort { get; set; } /// /// 登陆账号 ///
public string LoginId { get; set; } /// /// 登陆密码 /// [ProtectedString]
public string Password { get; set; } /// /// 使⽤SSL加密 ///
[DefaultValue(false)]
public bool UseSSL { get; set; } }
参数显⽰和保存的界⾯设计如下所⽰。
界⾯的初始化,同样和上⾯的差不多,不过这⾥使⽤了数据库的存储类DatabaseStorage,内容将保存在数据库⾥⾯,⽽且我们通过⽤户的标识Create进⾏路径的针对性处理,可以使每个⽤户的配置⽂件不同。
public partial class PageEmail : PropertyPage {
private SettingsProvider settings; private ISettingsStorage store; public PageEmail() {
InitializeComponent();
if (!this.DesignMode) {
//DatabaseStorage:在数据库⾥⾯,以指定⽤户标识保存参数数据 string creator = Portal.gc.LoginUserInfo.Name; store = new DatabaseStorage(creator); settings = new SettingsProvider(store); } }
参数的加载代码如下所⽰,也就是把数据获取后,显⽰在界⾯上即可。
public override void OnInit() {
EmailParameter parameter = settings.GetSettings(); if (parameter != null) {this.txtEmail.Text = parameter.Email;
this.txtLoginId.Text = parameter.LoginId;
this.txtPassword.Text = parameter.Password; this.txtPassword.Tag = parameter.Password; this.txtPop3Port.Value = parameter.Pop3Port; this.txtPop3Server.Text = parameter.Pop3Server; this.txtSmtpPort.Value = parameter.SmtpPort; this.txtSmtpServer.Text = parameter.SmtpServer; this.txtUseSSL.Checked = parameter.UseSSL; } }
数据的保存操作也很简单,和前⾯的操作差不多,如下所⽰。
EmailParameter parameter = settings.GetSettings(); if (parameter != null) {parameter.Email = this.txtEmail.Text; parameter.LoginId = this.txtLoginId.Text;
parameter.Password = this.txtPassword.Text;
parameter.Pop3Port = Convert.ToInt32(this.txtPop3Port.Value); parameter.Pop3Server = this.txtPop3Server.Text;
parameter.SmtpPort = Convert.ToInt32(this.txtSmtpPort.Value); parameter.SmtpServer = this.txtSmtpServer.Text; parameter.UseSSL = this.txtUseSSL.Checked; settings.SaveSettings(parameter); }最终,我们在数据库表⾥⾯,可以看到对应记录已经保存起来了,并且⽤户密码部分也进⾏了加密处理。
这样,我们整合两者的特点,就可以实现⽐较不错的参数配置界⾯的显⽰和后台存储处理了,针对性的,使⽤不同的存储介质,以满⾜不同的需要。