如果汉语背后没有文化,文化背后没有思想,思想背后没有精神,光TMD编造老娘和乔布斯没有说过的话,那中国永远不会是一个伟大的国家。——撒切尔夫人

刘一辰的软件工程随笔

C/S结构用户界面设计

信1905-2 20193897刘一辰

 
   

 

 

【实验编号】

10003809547j   图形用户界面设计

【实验环境】

l  所需硬件环境为微机;

l  所需软件环境为Microsoft Visual Studio 2013

【实验内容】

编写一整套Mis系统UI界面,Mis系统名称自拟,尽量运用到如下控件:

l  窗体

l  菜单

l  工具栏

l  状态栏控件

l  标签控件

l  按钮控件

l  文本框控件

l  单选按钮控件

l  复选框控件

l  列表框控件

l  组合框控件

l  分组框控件

l  面板控件

l  图片框控件

l  定时器控件

l  滚动条控件

l  月历控件

 

【关键步骤】

DataAgent类型中变量和方法的说明:

private string m_strConnectionString; //连接字符串

private OleDbConnection m_objConnection; //数据库连接

public DataAgent(string strConnection) //构造方法,传入的参数为连接字符串

private void OpenDataBase() //打开数据库连接

private void #region CloseDataBase() //关闭数据库连接

public DataView GetDataView(string strSqlStat) //根据传入的连接字符串返回DataView

具体实现代码如下:

public class DataAgent

{

    private string m_strConnectionString;

   private OleDbConnection m_objConnection;

    #region DataAgend

    ///<summary>

    /// Initial Function

    ///</summary>

    ///<param name="strConnection"></param>

    public DataAgent(string strConnection)

    {

        this.m_strConnectionString = strConnection;

    }

    #endregion

    #region OpenDataBase

    ///<summary>

    /// Open Database

    ///</summary>

    private void OpenDataBase()

    {

        try

        {

            this.m_objConnection = new OleDbConnection();

            this.m_objConnection.ConnectionString = this.m_strConnectionString;

            if (this.m_objConnection.State != ConnectionState.Open)

            {

                this.m_objConnection.Open();

            }

        }

        catch (Exception e)

        {

            throw e;

        }

    }

    #endregion

    #region CloseDataBase

    ///<summary>

    /// Close Database

    ///</summary>

    private void CloseDataBase()

    {

        if (this.m_objConnection != null)

        {

            if (this.m_objConnection.State == ConnectionState.Open)

            {

                this.m_objConnection.Close();

            }

        }

    }

    #endregion

    #region GetDataView

    ///<summary>

    /// Execute the sql and return the default table view

    ///</summary>

    ///<param name="strSelectString">Select String</param>

    ///<returns>DataView of the DataTable</returns>

    public DataView GetDataView(string strSqlStat)

    {

        try

        {

            this.OpenDataBase();

            OleDbDataAdapter objDataAdapter = new OleDbDataAdapter(strSqlStat.Trim(), this.m_objConnection);

            DataSet objDataSet = new DataSet();

            objDataAdapter.Fill(objDataSet);

            return objDataSet.Tables[0].DefaultView;

        }

        catch (Exception e)

        {

            throw e;

        }

        finally

        {

            this.CloseDataBase();

        }

    }

    #endregion

}

3.Business的具体实现:

建立名为Base的类,此类作为其他事务类的基类,其中定义了一个DataAgent的实例。其他所有的Business类都从该改类派生。

在该类中添加对DataAgent的引用,使所有的事务类都能使用DataAgent中的方法。

Base.cs源代码:

public abstract class Base

{

    protected DataAgent OleDBAgent = new DataAgent("Provider=SQLOLEDB;Data Source=(local);DataBase=test;User ID=sa;PWD=");

}

准备好了数据操作层和事务层的基类,底下就可以正式地开始业务逻辑类的开发了,如有一个显示新闻的类News,其中包含了一个GetNewsList()的方法,该方法用来获取所有的新闻标题列表,代码如下:

public class News : Base

{

    public DataView GetNewsList()

    {

        string strSql;

        strSql = "";

         strSql += " SELECT Top 10 NewsId,NewsTitle ";

        strSql += " FROM Tb_News";

        strSql += " WHERE NewsEnable = 1";

        strSql += " ORDER BY NewsId ";

        return OleDBAgent.GetDataView(strSql);

    }

}

由于数据库结构比较简单,在此就不再给出详细的表结构。

4.UI层对Business中接口的调用

首先,在窗体Form1中添加对News类的引用。

然后,在窗体Form1中添加一个(DataGridView)dgNews用来显示新闻列表。

在窗体的Form1_Load方法中添加如下代码:

private void Form1_Load(object sender, EventArgs e)

{

    News objNews = new News();

    this.dgNews.DataSource = objNews.GetNewsList();

}

 

 

【程序运行截图】

l  窗体

 

l  菜单

 

l  工具栏

 

l  状态栏控件

 

l  标签控件

 

 

l  按钮控件

 

l  文本框控件

 

l  单选按钮控件

 

l  复选框控件

 

l  列表框控件

 

l  组合框控件

 

l  分组框控件

 

l  面板控件

 

l  图片框控件

 

 

l  定时器控件

 

 

l  滚动条控件

 

 

l  月历控件

 

 

【实验体会】

现在正在修改bug,主要是GUI控制的问题。

用户有n多个口可以和界面交换,堵都堵不过来。究其原因,设计者将多个界面的功能全加到了一个界面中,例如,将New和Edit的见面合并,New和Edit公用一个Save按钮,结果互相影响。

我觉得GUI上能够和用户交互的控件能少就少,没增加一个控件,就多了一个出现bug的风险。在保证用户友好性的前提下,将不同的交换控件放到不同的界面进行划分,否则控制起来太费劲了。

posted @   崤函隳  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2020-10-10 2020/10/10 刘一辰的JAVA随笔
点击右上角即可分享
微信分享提示