C# C/S结构数据库系统框架详解(一)[vjsdn]

自发布《多文档界面(MDI)系统框架-C#完整版》后又有了新想法,就是再写个C#版C/S结构系统框架。
因时间关系断断续续写了很久。借周日机会,我将源代码整理好再写些说明文档发布出来,希望给大家
带来学习机会。

   特别声明的是: C/S结构系统框架是优化和改编自几个大型系统,是经历过考验和实际应用的。希望大家好好珍惜。这个框架有很多学习要点,提醒大家不仅仅是下载代码而应该去好好研究,甚至阅读每一行代码每一个模块每一个细节! 你学会了它也许将来作为一个优秀架构师需要设计同样一个系统时,这时你用上它,不是事半功倍么?

另外,请尊重作者版权,写一个框架的确需要大量时间和精力。程序员有个共性是写作永无止境,虽是深夜2点,但我们仍在思考,仍在写作! 眼睛睡觉了但思维和创作动力仍在冗奋中,作为一个程序员的你,我说的对吗?有同样的感受吗? 所以:转载时请注明本文来自易学网www.vjsdn.net!

言归正传,接下来讲解系统框架实现过程。

首先看几个图对框架有个初步认识。

1.登陆窗体

C# C/S结构数据库系统框架详解(一)[vjsdn]_第1张图片

准备登录窗体
C# C/S结构数据库系统框架详解(一)[vjsdn]_第2张图片

如通过验证用户,则加载MDI主窗体,留意图片内的动态消息:
正在初始化用户界面,请稍候.

登录窗体是多数应用程序的入口,在进入系统前需要用户验证。请看实现过程:

2.MDI主窗体

 C# C/S结构数据库系统框架详解(一)[vjsdn]_第3张图片

登录成功后显示MDI主窗体.
图片为测试模块II的主界面.

C# C/S结构数据库系统框架详解(一)[vjsdn]_第4张图片

登录成功后显示MDI主窗体.
图片为系统管理模块的主界面.

3.关于程序/作者
C# C/S结构数据库系统框架详解(一)[vjsdn]_第5张图片

 

4.解决方案
C# C/S结构数据库系统框架详解(一)[vjsdn]_第6张图片

 

用代码实现登录到加载MDI主窗体.

1.程序入口代码:

 

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
     
static class Program
{
[STAThread]
static void Main()
{
// 捕获系统所产生的异常。
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);

SystemConfig.ReadSettings();
// 读取系统设置
bllService.SetDataBasePath(); // 因用到Access,指定一个MDB文件

Process instance
= SingletonProgram.GetRunningInstance();
if (instance != null ) Msg.Warning( " 程序已经运行. " );

if ((instance != null ) && ( ! SystemConfig.CurrentConfig.AllowRunMultiInstance))
{
SingletonProgram.HandleRunningInstance(instance);
// Active instance
return ;
}

Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(
false );

// 注意:先打开登陆窗体,如登陆成功后再正式运行程序(MDI 主窗体)
// 学会这种写法。
if (AppEntry.Login())
Application.Run(AppEntry.MainForm);
else
Application.Exit();
}

private static void Application_ThreadException( object sender, ThreadExceptionEventArgs e)
{
Msg.ShowException(e.Exception);
}
}

转载请注明来自易学网 www.vjsdn.net 易学原创作品

留意这段代码:

 
    
if (AppEntry.Login())
Application.Run(AppEntry.MainForm);
else
Application.Exit();

 

调用AppEntry类表态方法Login(),如登录成功,此时已经创建MainForm实例,则运行主窗体.

AppEntry类是个公共类,仅定义登录方法及MDI主窗体变量.
在登录窗体内用到该类.用户登录成功则创建frmMain实例.然后调用Application.Run(AppEntry.MainForm)方法.

2.AppEntry类,应用程序入口类.

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
     
public class AppEntry
{
public static bool Login()
{
return frmLogin.TryLogin();
}

private static frmMain _mainForm = null ;
public static frmMain MainForm { get { return _mainForm; } set { _mainForm = value; } }
}

3.登录窗体源代码:

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
     
public partial class frmLogin : Form
{
// 将构造器设为静态,防止外部创建实例
private frmLogin()
{
InitializeComponent();
}

///
/// 打开登陆窗体,公开一个主静态方法
///

///
public static bool TryLogin()
{
frmLogin form
= new frmLogin();
bool ret = form.ShowDialog() == DialogResult.OK;
return ret;
}

private void btnLogin_Click( object sender, EventArgs e)
{
// 调用业务层登录方法
bool ret = new bllUser().Login(txtUser.Text, txtPwd.Text);

if (ret)
{
// 登录成功创建主窗体
AppEntry.MainForm = new frmMain();

// 初始化主窗体(如加载模块,初始化用户界,加载系统参数)
// 在初始化同时login窗体会动态显示信息。
AppEntry.MainForm.InitUserInterface( new StatusLable( this .lblLoadingInfo));

this .DialogResult = DialogResult.OK;
this .Close(); // 关闭登陆窗体
}
else
{
Msg.Warning(
" 登录失败,请检查用户名和密码! " );
}
}

private void btnCancel_Click( object sender, EventArgs e)
{
this .Close();
}
}
转载请注明来自易学网 http:
// www.vjsdn.net/ 易学原创作品

 

这里需要调用业务层执行用户登录. 要学会将业务代码与界面代码分离.

 
    
// 调用业务层登录方法
bool ret = new bllUser().Login(txtUser.Text, txtPwd.Text);

if (ret)
{
.........

 

当登录成功,创建MDI主窗体实例,然后调用实例方法InitUserInterface.这时初始化主窗体.

 
    
// 初始化主窗体(如加载模块,初始化用户界,加载系统参数)
// 在初始化同时login窗体会动态显示信息。
AppEntry.MainForm.InitUserInterface( new StatusLable( this .lblLoadingInfo));

 

4.下面是MDI主窗体的代码:

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
     
public partial class frmMain : Form
{
// 模块管理器实例
private ModuleManager _ModuleManager;

public frmMain()
{
InitializeComponent();
}

// 初始化用户接口
public void InitUserInterface(StatusLable splash)
{
this .SuspendLayout();

splash.UpdateMessage(
" 正在初始化用户界面,请稍候... " );
_ModuleManager
= new ModuleManager( this , xtraTabControl1); // 创建模块管理器
_ModuleManager.LoadModules(splash); // 加载可用模块

splash.UpdateMessage(
" 正在加载工具栏... " );
_ModuleManager.CreateNavBarButtons(
this .navBarControl1, this .menuStrip1); // 创建导航工具栏按钮

splash.UpdateMessage(
" 正在加载用户模块... " );

splash.UpdateMessage(
" 正在初始化数据... " );

splash.UpdateMessage(
" 加载完毕. " );

this .ResumeLayout();
}

///
/// 显示由参数指定的模块
///

public void ActiveModule( string moduleDisplayName)
{
foreach (XtraTabPage page in this .xtraTabControl1.TabPages)
{
if (page.Text.Equals(moduleDisplayName))
{
xtraTabControl1.SelectedTabPage
= page;
return ;
}
}
}

private void btnHelp_Click( object sender, EventArgs e)
{
new frmAboutVjsdn().ShowDialog();
}

private void btnClose_Click( object sender, EventArgs e)
{
this .Close();
}

private void btnAbout_Click( object sender, EventArgs e)
{
new frmAboutVjsdn().ShowDialog();
}
}
转载请注明来自易学网 http:
// www.vjsdn.net/ 易学原创作品

窗体类定义一个_ModuleManager变量,用于加载模块.请看ModuleManager详解.
InitUserInterface()方法是初始化主窗体方法.由frmLogin调用.

转载请注明来自易学网 http://www.vjsdn.net/ 易学原创作品


续....

==================================================

全部链接:
1.C/S结构数据库系统框架详解
http://www.vjsdn.net/bbs/bbsTopicDetails.aspx?pid=109201218

2.ModuleManager详解
http://www.vjsdn.net/bbs/bbsTopicDetails.aspx?pid=109201219

3.如何新建一个模块
http://www.vjsdn.net/bbs/bbsTopicDetails.aspx?pid=109201220

4.C/S结构数据库系统框架源代码
http://www.vjsdn.net/bbs/bbsTopicDetails.aspx?pid=109201221

转载于:https://www.cnblogs.com/raychn/archive/2010/07/23/1783612.html

你可能感兴趣的:(C# C/S结构数据库系统框架详解(一)[vjsdn])