基于.NET平台的Windows编程实战(八)— 数据库管理及其他辅助功能的实现

原创|其它|编辑:郝浩|2009-06-08 10:38:19.000|阅读 687 次

概述:本系列课程是专为新手们写来入门练习用的,目的是想通过一个完整的问卷调查管理系统案例来让新手们了解、加深或是熟悉项目的开发流程及在.NET平台上使用VS2005和C# 进行Windows方面的编程;在整个课程的设计上,我尽量避开或是根本不讨论底层的以及性能优化等方面的东西,故高手完全可以无视本系列课程。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

申明:本系列课程是专为新手们写来入门练习用的,目的是想通过一个完整的问卷调查管理系统案例来让新手们了解、加深或是熟悉项目的开发流程及
.NET平台上使用VS2005C# 进行Windows方面的编程;在整个课程的设计上,我尽量避开或是根本不讨论底层的以及性能优化等方面的东西,
故高手完全可以无视本系列课程。

    本课将带领大家一起来实现数据库导出与还原、窗口管理等辅助功能。这些功能并非本案例系统的主要功能,只是一些辅助上的功能,
故本课程的只是提取几个功能出来简单的讲解一下其实现的原理或方法,至于其设计的思路在这里就不讲了,似乎没有什么可讲的^_^
    
下面进入主题吧……

一、数据库导出与还原功能的实现
大家在一些系统里应该也看到过数据库导出与还原的功能,不知道大家在使用的时候有没有去想过其实现的原理?其实,其实现的原理与逻辑是非常之简单的:
导出时,找到其数据库存放的位置及其名称,之后用一个File.Copy()方法将其COPY到新的位置即可;
而还原,正好是相反,即从新的位置COPY到当前系统数据库的位置,
并覆盖掉当前系统的数据库;其实现的代码如下所示:

/// <summary>
        
/// 导出数据库
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void BakDbToolStripMenuItem_Click(object sender, EventArgs e)
        
{
            
string dbpath = @"..\..\DataBase\Lj_QuestionnaireSys.mdb";//获取当前数据库路径,如有问题请在前面加上"..\..\",但在发布时要去掉前面的"..\..\"
            string _dbpath = dbpath.Substring(dbpath.LastIndexOf('\\'));//取出数据库的名称
            SaveFileDialog saveFileDialog = new SaveFileDialog();//打开保存路径的对话框
            saveFileDialog.Filter = "Access数据库文件(*.mdb)|*.mdb"//设置保存的文件类型           
            saveFileDialog.Title = "请选择保存的路径";//对话框标题
            saveFileDialog.RestoreDirectory = true;//当对话框关闭前还原到当前目录状态
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            
{
                
try
                
{
                    File.Copy(dbpath, saveFileDialog.FileName,
true);//将数据库文件复制到选择的新路径位置
                    MessageBox.Show("导出成功!请妥善保管好您所导出的数据库!^_^","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
                }

                
catch (Exception)
                
{
                    MessageBox.Show(
"导出失败!请重新导出!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

            }

            
        }

        
/// <summary>
        
/// 还原数据库
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void RDbToolStripMenuItem_Click(object sender, EventArgs e)
        
{
            
if (MessageBox.Show("注:此操作将会还原掉现有的数据库,且不可恢复,请谨慎操作!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK)
            
{
                
string dbpath = @"..\..\DataBase\Lj_QuestionnaireSys.mdb";//获取当前数据库路径,如连接有问题请在前面加上"..\..\",但在发布时要去掉前面的"..\..\"
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Filter 
= "Access数据库文件(*.mdb)|*.mdb";
                ofd.Title 
= "请选择要还原的数据库,并打开";
                ofd.RestoreDirectory 
= true;
                
if (ofd.ShowDialog() == DialogResult.OK)
                
{
                    
try
                    
{
                        File.Copy(ofd.FileName, dbpath, 
true);//将选择要还原的数据库覆盖掉当前的数据库
                        MessageBox.Show("还原成功!请刷新相应列表!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                    
catch (Exception)
                    
{
                        MessageBox.Show(
"还原失败!请检查要还原的数据库是否正确!""操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }


                }

            }

        }
二、窗口管理功能的实现
看过前面第五课的朋友们,应该知道,我们在本案例系统中使用了一个叫作DockPanel的第三方开源控件,
在这里我们就来简单的说说它的一些功能的实现方法吧。
首先,我们来看看系统左边的“系统管理”工具箱的实现吧。
先新建一个如下图8-1所示的名为 ToolFrom”的新窗体[至于相关功能的实现请自行下载下面的本课程源码进行查看,在这里就不讲了]

图8-1
那么,建好之后,如何让其如下图8-2所示浮动在主窗口的左边呢?

图8-2
在这里,我们就需要用到第三方开源控件DockPanelDockTo()方法了,其实现的原理的是这样的:
dockPanel(通过前面课程的学习,我们应该知道所有的打开子窗口,如问卷管理,都是放在dockPanel容器中的)中依次查找所有打开的子窗口,
如果找到所需的窗口则将其
dockPanel中停靠的位置和方式设置成DockStyle.Left,即使其靠左边停靠,其实现的代码如下所示:

/// <summary>
        
/// 系统管理
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void SysMToolStripMenuItem_Click(object sender, EventArgs e)
        
{
            
if (checkChildFrmExist("系统管理"== true)
            
{
                
return;
            }

            
else
            
{
                ToolForm tf 
= new ToolForm();
                tf.Show(dockPanel);
                tf.DockTo(dockPanel, DockStyle.Left);
            }

        }

        
/// <summary>
        
/// 查找当前打开的活动子窗口
        
/// </summary>
        
/// <param name="childFrmName">活动子窗口的标题</param>
        
/// <returns></returns>

        public bool checkChildFrmExist(string childFrmName)
        

            
foreach (IDockContent childFrm in dockPanel.Contents)
            
{
                
if (childFrm.DockHandler.TabText == "系统管理")
                
{
                    
if (!childFrm.DockHandler.IsActivated)
                    

                        childFrm.DockHandler.DockTo(
this.dockPanel, DockStyle.Left);
                    }

                    
return true;
                }

            }

            
return false;
        }
   

其次,我们再来看看关闭其他窗口的实现的原理,先来看代码:

/// <summary>
        
/// 关闭其他窗口
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void COtherToolStripMenuItem_Click(object sender, EventArgs e)
        
{
            
if (dockPanel.DocumentStyle == DocumentStyle.SystemMdi)
            
{
                Form activeMdi 
= ActiveMdiChild;
                
foreach (Form form in MdiChildren)
                
{
                    
if (form != activeMdi)
                        form.Close();
                }

            }

            
else
            
{
                
foreach (IDockContent document in dockPanel.DocumentsToArray())
                
{
                    
if (!document.DockHandler.IsActivated)
                        document.DockHandler.Close();
                }

            }

        }


从上面的代码中,我们可以看出其实现的原理是这样的:在dockPanel中依次查找所有的打开的子窗口,
如果查找到的子窗口不是当前打开的正处于活动状态的子窗口,则将其关闭掉。
最后,我们来看看任务栏图标的创建方法。
大家都知道QQ运行时,在桌面右下侧的任务栏中会有一个QQ的图标,那么这个图标是如何制作出来的呢?
其实在VS2005的开发中很容易实现,我们只要将工具栏中的notifyIcon控件拖动到主窗口“MainFrom”中,
并给其Icon属性选择一个我们喜欢的ico图片即可!呵呵,是不是很简单呀^_^

OK,本课程就先到这里,如有其它不清楚或疑惑的地方,请在下面留言说明,我将尽全力给予解答,希望能给大家带来一点帮助!
谢谢的大家支持……

附:本课程源码下载

标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:博客园

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP