精华内容
下载资源
问答
  • C#项目案例-Winform案例

    热门讨论 2010-06-14 07:31:44
    项目管理 文档管理 网络监视 实时聊天 快递管理 俄罗斯方块 电子商务 博客论坛
  • WINFORM案例项目代码

    2014-09-20 11:09:53
    WINFORM控件,事件及SQL数据库操作
  • Winform项目实战

    2012-06-27 00:09:02
    详细介绍了winform各种开发 应该对初学者而言有所帮助
  • WinForm项目实战.pdf

    2012-03-25 22:55:06
    WinForm项目实战.pdf
  • Winform项目

    2010-04-19 18:44:55
    一个简单的winform案例,学生成绩管理系统
  • 委托和定时器案例分析(两个).rar 没有窗体但是有运行结果 ·委托机制的复习 ·定时器分析 ·定时器优化 ·备忘录需求分析延伸出来的学习内容!
  • 创建 WinForm 数据库应用程序执行模糊查询 要求输入用户名在数据库中检索用户名并显示该用户的详细信息 使用 ListView 控件显示用户信息 创建示例数据库 数据库示例代码 use master go if exists(select * ...

    创建 WinForm 数据库应用程序执行模糊查询
    要求输入用户名在数据库中检索用户名并显示该用户的详细信息
    使用 ListView 控件显示用户信息

    创建示例数据库
    数据库示例代码

    use master
    go
    
    if exists(select * from sysdatabases where name='test3')
    drop database test3
    go
    
    create database test3 on primary
    (
    	name='test3_data',
    	filename='D:\test3_data.mdf',
    	size=5mb,
    	maxsize=10mb,
    	filegrowth=1mb
    )
    log on
    (
    	name='test3_log',
    	filename='D:\test3_log.ldf',
    	size=5mb,
    	maxsize=10mb,
    	filegrowth=1mb
    )
    go
    
    use test3
    go
    
    if exists(select * from sysobjects where name='Students')
    drop table Students
    go
    
    create table Students
    (
    	studentId varchar(20) primary key not null,
    	userName varchar(20) null,
    	name varchar(20) null,
    	userStateId int null
    )
    go
    
    insert into Students (studentid,username,name,userStateId) values ('100001','leeho','小白',1)
    insert into Students (studentid,username,name,userStateId) values ('100002','dna','小黑',0)
    go

    设计窗体

    设置 ListView 控件的 Columns 属性 添加4项
    将 ListView 控件的 View 属性设置为 Details

    创建DBHelper类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.SqlClient;
    
    namespace ADOWinForm
    {
        class DBHelper
        {
            public static string conStr = "Data Source=.;Initial Catalog=Test3;"+
                "User ID=sa;Pwd=leeho";
            public static SqlConnection con = new SqlConnection(conStr);
    
        }
    }
    

    构建 Form1 代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    
    namespace ADOWinForm
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                /*使用代码初始化界面设置
                this.listView1.View = View.Details;
                ColumnHeader CuserName = new ColumnHeader();
                CuserName.Text = "用户名";
                ColumnHeader CName = new ColumnHeader();
                CName.Text = "姓名";
                ColumnHeader CstudentId = new ColumnHeader();
                CstudentId.Text = "学号";
                ColumnHeader Cstate = new ColumnHeader();
                Cstate.Text = "状态";
    
                listView1.Columns.Add(CuserName);
                listView1.Columns.Add(CName);
                listView1.Columns.Add(CstudentId);
                listView1.Columns.Add(Cstate);
                */
            }
    
            //检查用户名是否为空
            public bool CheckInput()
            {
                if (textBox1.Text.Trim() == "")
                {
                    MessageBox.Show("请输入用户名!");
                    //设置光标位置
                    textBox1.Focus();
                    return false;
                }
                else
                {
                    return true;
                }
            }
    
            //查找并填充 ListView 控件
            public void FillListView()
            {
                //学生ID
                string studentId;
                //用户名
                string userName;
                //姓名
                string name;
                //状态
                int userStateId;
                //状态字符串形式
                string userState;
    
                //SQL 查询语句
                string sql = string.Format("select studentId,userName,name,userStateId from "
                +"Students where userName like '%{0}%'", textBox1.Text);
                try
                {
                    //创建 Command 对象
                    SqlCommand comm = new SqlCommand(sql, DBHelper.con);
                    //打开数据库连接
                    DBHelper.con.Open();
                    //执行 Command 的 ExecuteReader() 方法 返回 DataReader 对象
                    SqlDataReader dataReader = comm.ExecuteReader();
    
                    //清空 ListView 控件
                    listView1.Items.Clear();
    
                    //如果没有记录
                    if (!dataReader.HasRows)
                    {
                        MessageBox.Show("没有找到!");
                    }
                    else
                    {
                        //循环读取下一条记录
                        while (dataReader.Read())
                        {
                            //将数据库查到的列值保存到变量中
                            studentId = (string)dataReader["studentId"];
                            userName = (string)dataReader["userName"];
                            name = (string)dataReader["name"];
                            userStateId = (int)dataReader["userStateId"];
    
                            //将状态值转换为字符串形式
                            userState=userStateId==1?"活动":"非活动";
    
                            //创建 ListView 项
                            ListViewItem item = new ListViewItem();
                            //设置项头
                            item.Text = userName;
                            //设置Tag属性
                            //item.Tag = (string)dataReader["studentId"];
                            //在项中添加属性
                            item.SubItems.AddRange(new string[] { name, studentId, userState });
                            //将 ListView 项添加到 ListView 控件中
                            listView1.Items.Add(item);
                        }
                    }
                    //关闭 DataReader 对象
                    dataReader.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    //关闭数据库
                    DBHelper.con.Close();
                }
            }
    
            //查询按钮事件
            private void button1_Click(object sender, EventArgs e)
            {
                //检查用户名是否为空
                if (CheckInput())
                {
                    //执行检索数据
                    FillListView();
                }
            }
        }
    }
    



     

    展开全文
  • C#WinForm学习实战项目

    2019-09-16 15:11:42
    C#的Winform开发案例,适合初学者学习的Demo级别教程,对很多控件做了一个介绍和基本使用
  • Winform技术要点及案例项目开发小结

    千次阅读 2017-01-17 15:18:35
    近期帮朋友开发了一个小型WINFORM的软件,即在软件窗体中显示相关表格的数据。... 现总结一下此次项目开发的经验教训,以便后期借鉴。 1.winform虽然目前已不再是主流的开发技术, 但对于小型的需求,仍不失为一个

    近期帮朋友开发了一个小型WINFORM的软件,即在软件窗体中显示相关表格的数据。由于长时期未操作WINFORM了,有点手生,尤其是对于EXCEL表格的操作,在没有第三方控件辅助的基础上,更感到了吃力。 但所幸功夫不负有心人, 终于让我找到了相关的解决方案。 现总结一下此次项目开发的经验教训,以便后期借鉴。


    1.winform虽然目前已不再是主流的开发技术, 但对于小型的需求,仍不失为一个不错的选择,尤其是对于小型单机办公型应用程序,其界面的友好性,及相关控件操作的简易性,很适合开发小型的桌面应用程序。


    2.闪屏现象解决方案。由于在窗体中加入大量图片,以及绘图等操作,在程序启动或加载某个界面时出现屏幕闪烁的问题。为了解决这种现象,可以在窗体构造函数中加入如下代码,以解决闪屏现象。其中第一行一般为程序自带代码, 后面几行主要是解决屏幕变化出现的闪烁现象,即进行一定的缓冲操作。

                 InitializeComponent();

                this.DoubleBuffered = true;//设置本窗体
                SetStyle(ControlStyles.UserPaint, true);
                SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
                SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲


    3.窗体容器panel的使用, 即如果需要对窗体背景图片进行分割,可以利用容器控件进行适当的操作。


    4.基本控件的使用,如control,label,textbox等等。


    5.datagridview控件的使用。对于没有格式要求的数据显示,datagridview及listview可以做为基本的显示控件,且可以通过调整相关的属性,如控件头部隐藏,边框隐藏,填充窗体的方式等进行简单的格式调整,但对于合并单元格等操作,但一般需要进行绘图等复杂操作,相应的代码较为复杂。

    5.1 datagridview的读取数据操作。

    string str = @"d:\cpcx\cpqlc.xls";//也可以通过打开文件对话框进行选择文件。

    DataTable dt = ExcelUp(File); //  将excel文件读取到DATATABLE
    dataGridView1.AutoGenerateColumns = true;  //设置datagridview自动增加列,即新添加的数据自动新添加列。
    dataGridView1.DataSource = dt;  //设置数据源。

    public DataTable ExcelUp(string fileName)
            {
                string filePath = fileName;//读取excel文件路径;

                DataTable dt = GetDataTable("Sheet1", filePath);

                return dt;

            }

    protected DataTable GetDataTable(string strSheetName, string strExcelFileName)
            {
                //源的定义,即ADO的读取数据操作。

               //string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + Server.MapPath("ExcelFiles/MyExcelFile.xls") + ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'";//此连接只能操作Excel2007之前(.xls)文件

               string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source={0};" + "Extended Properties='Excel 8.0;HDR=NO;IMEX=1';", strExcelFileName);//此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串).

    //备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。
    //      "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。



    特别注意

    Extended Properties='Excel 8.0;HDR=yes;IMEX=1'

    A: HDR ( HeaDer Row )设置

    若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称

    若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称

    B:IMEX ( IMport EXport mode )设置

    IMEX 有三种模式,各自引起的读写行为也不同,容後再述:

    0 is Export mode

    1 is Import mode

    2 is Linked mode (full update capabilities)

    我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:

    当IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。

    当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。

    当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。






                //Sql语句
                string strExcel = string.Format("select * from [{0}$]", strSheetName);

                //定义存放的数据表
                DataSet ds = new DataSet();

                //连接数据源
                OleDbConnection conn = new OleDbConnection(strConn);

                try
                {
                   conn.Open();
                    //适配到数据源
                    OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);
                    adapter.Fill(ds, strSheetName);
                }
                catch (Exception e)
                {
                    throw e;
               }
                finally
                {
                    conn.Close();
                }
               return ds.Tables[strSheetName];
            }


    5.2 datagridview单元格绘制操作。


    5.3 listview的读取数据操作。

    listViewData.Items.Clear();
    listViewData.Columns.Clear();
    listViewData.Columns.Add("", 0, HorizontalAlignment.Center);

    listViewData.Columns.Add("序号",40, HorizontalAlignment.Right);

    listViewData.Columns.Add("快递单号",120, HorizontalAlignment.Center);

    listViewData.Columns.Add("修改重量",80, HorizontalAlignment.Right);

    var i =0;var strShuju ="";//取得的字符串
    IDataObject iData = Clipboard.GetDataObject();

    if (iData.GetDataPresent(DataFormats.Text)) { strShuju= (string)iData.GetData(DataFormats.Text); }

    if (strShuju.IndexOf("\r\n") == -1)return;

    var iShuju = strShuju.Length; //字符串总长度
     while (strShuju != "")

    {

        try {

               var myItem =new ListViewItem(); myItem.SubItems.Add((++i).ToString());var strRow = strShuju.Substring(0, strShuju.IndexOf("\r\n"));// 每行字符串
               var iRow = strShuju.Substring(0, strShuju.IndexOf("\r\n")).Length;//每行字符串长度

                var iRow1 = 0; //每行字符串长度
                 if (iRow == 0)

                 break;

                 iRow1 = iRow + 1;

                 iRow = iRow + 2;

                 iShuju = iShuju - iRow;

                 strShuju = strShuju.Substring(iRow, iShuju);

                 strRow = strRow + "\t";while (strRow !="") {var strColumn = strRow.Substring(0, strRow.IndexOf("\t"));//每段字符串
                 var iColumn = strColumn.Substring(0, strRow.IndexOf("\t")).Length;//每段字符串长度
             

                   if (iRow1 == 0) break;

                   iRow1 = iRow1 - iColumn -1;

                   strRow = strRow.Substring(iColumn +1, iRow1);

                   myItem.SubItems.Add(strColumn); }

                  listViewData.Items.Add(myItem);

             }

               

            catch (ArgumentOutOfRangeException)

                    { break; } }


    5.4 listview单元格绘制操作。


    6.窗体布局的动态调整, 一般编程时,各个窗体及控件的大小及位置都是固定好了,这样也可以减少程序运行时的负担,即加快运行速度。但对于部分程序,窗体的大小需要根据运行屏幕的尺寸进行改变,这时就需要编码进行动太调整窗体大小了,一般代码如下,当然,窗体中的其它控件也可以进行类似的调整。

                Rectangle rect = Screen.GetWorkingArea(this);//获取屏幕尺寸。
                this.Height = rect.Height;//设置窗体尺寸。
                this.Width = rect.Width;


    7.窗体样式的动态调整。如果需要在程序运行时独占屏幕,且不出现状态栏,最大/小化按钮,及关闭按钮等样式,可以进行以下代码编程。

    if (this.WindowState == FormWindowState.Maximized)  //判断窗体是否最大化
                {
                    this.FormBorderStyle = FormBorderStyle.None;// 窗体的边框及标题栏的状态
                }
                else
                {
                    this.FormBorderStyle = FormBorderStyle.None;//
                    this.WindowState = FormWindowState.Maximized;//
                }


    8. VS平台智能提示异常问题的解决。即从开始->Microsoft Visual Studio 2008->Visual Studio Tools->Visual Studio 2008 命令提示,进入Common7\IDE,然后输入:devenv.exe /setup /resetuserdata /resetsettings或devenv.exe/resetsettings。


    9.窗体切换操作代码:Forms f=new Forms();            f.Show();            this.Hide();


    10.复杂表格界面的实现。由于VS自带的控件只能实现简单的图表界面,故在实现复杂界面时,如果堆积简单的LABEL,TEXTBOX等控件,则不仅费时,也加重程序运行负担,故需要借用第三方控件, 而大部分简便的控件都是收费的,如水晶报表,DevExpress,NOPI等,但是微软自已的控件dsoframer, 也可以实现类似功能,但操作可能相对复杂,即在调整界面时需要调整控件及EXCEL表格各自的相关属性,以实现项目要求。但dsoframer的使用一般先进行注册,即可以从微软下载后进行本机注册,也可以借助集成的注册程序进行注册。

    10.1注册一下DSOFramer.ocx

        操作:将DSOFramer.ocx复制到C:/windows/system32目录下,

         开始->运行->regsvr32 DSOFramer.ocx , 系统会提示DSOFramer.ocx中的DllRegisterServer成功。

    10.2添加DSOFramer.ocx到你的项目中,即添加COM组件到VS,即可在工具箱中发现安装成功。一般安装后需要重启,以便顺利使用。

    10.3 dsoframer的主要属性, 即ActivationPolicy属性可以设置打开的文件是否处于激活状态;其它表头,边框调整等。

    10.4 dsoframer的打开文件事件。即axFramerControl1.Open("文件名");

    10.5由于dsoframer打开文件的方式是独占方式,故为了控制文件及时关闭,需要在关闭控件所在窗体时显式关闭该控件。即this.axFramerControl1.Close();


    另外,由于该控件是直接打开的EXCEL文件,同时无法设置EXCEL的单元格背景色,故与效果图有些许差别。但相对于单元格错位来说,也基本达标吧。



    11.有些项目在屏幕尺寸上有特殊要求,因此,如果开发平台的屏幕尺寸太小,可以在程序中定义一个尺寸基准变量,后续所有的尺寸以此为基础,而在正式提交前,可以更改此变量,从而更改所有的尺寸信息,当然,这也会增加程序启动的负担。



    12. C#中是没有所谓的全局变量的.要构造出类的属性作为全局变量。

    即可以在Globale类中写:public static string user = ""; //定义变量 user ="abcd";//赋值构造public string User { get { return user ; } set { user =value; }//定义属性。

    这样就可以其他窗体访问此User MessageBox.Show (GlobalParams .User); //直接访问. 显示.结果:"abcd"

    GlobalParams frm=new GlobalParams (); frm.User="efg"; //修改该静态变量的值 MessageBox.Show (GlobalParams .User); //直接访问. 显示.结果:"efg"


    13.另外,在进行操作EXCEL时,注意相关的变量名不要与系统关键字等重复。如某一列的列名不能是password.


    14.获得指定文件的目录:Path.GetDirectoryName(str);

    15.创建文件。File.Create (String, Int32, FileOptions) 。

    如果是创建EXCEL文件。则操作如下。

                Microsoft.Office.Interop.Excel.Application excelApp;//声明创建EXCEL的操作程序的变量,即API。
                excelApp = new Microsoft.Office.Interop.Excel.Application();
                Microsoft.Office.Interop.Excel.Workbook excelBook = excelApp.Workbooks.Add(1);//实际创建EXCEL。
                Microsoft.Office.Interop.Excel.Worksheet excelSheet = (Microsoft.Office.Interop.Excel.Worksheet)excelBook.Worksheets[1];//创建EXCEL中的工作表。
                excelApp.Visible = false;// EXCEL是否可见。
                string path = Path.GetDirectoryName(str);//获取某个文件的目录。
                excelBook.SaveAs(将EXCEL保存为。
                excelSheet.Cells[1, 1] = "username";//给EXCEL标题栏赋值。
                excelSheet.Cells[1, 2] = "pwdword";
                excelSheet.Cells[1, 3] = "status";
                excelSheet.Cells[1, 4] = "classno";
                excelSheet.Cells[1, 5] = "cardno";
                excelSheet.Cells[1, 6] = "loginno";
                excelApp.DisplayAlerts = false;// 是否显示保存对话框。
                excelApp.SaveWorkspace();//将EXCEL内容存储。
                excelApp.Quit();//EXCEL程序退出。


    16.SQL中的ExecuteNonQuery()只返回受影响的行数,因此,若进行查询操作,则一直返回0;此时需要进行ExecuteScalar()操作,以判断是否获取到值了。同时,由于SQL是一条记录一条记录地进行查询,因此,ExecuteScalar()返回的是所查询记录的第一个字段。 若需要获取其它字段,需要将记录复制到其他。


    17. dataset中数据的访问格式:ds.Tables[0].Rows[0]["字段"]。


    18.遍历某个文件夹下的文件方法。

    string str=Path.GetDirectoryName(oper.Str);
                DirectoryInfo TheFolder = new DirectoryInfo(str);
               

                foreach (FileInfo NextFile in TheFolder.GetFiles())


    19.在以EXCEL存储信息时,需要考虑文件的容量,从而需要考虑在容量不够时新建新的文件,从而引发了数据操作的复杂性。但也无非是多个条件判断而已。


    20.C#中怎样取路径中的文件名?

    FileInfo fi = new FileInfo("C:\\text.txt");
    string strName = fi.Name; // text.txt


    21.于C#中操作EXCEL后,关闭对象但EXCEL进程仍然存在的解决办法。设置excelApp.DisplayAlerts = false,就是不提问任何提示,这样再关闭EXCEL对象时,就不会有保存提示,也就不会卡住了.

    经试验,此方法不完全正确,需要改进。

    在利用SQL进行EXCEL查询,修改,插入,删除等操作时,无需建立EXCEL操作对象,只需建立连接,并及时关闭即可,因此,在此过程中没有多余的EXCEL进程存在的。

    但若涉及到EXCEL对象,则需要及时关闭。即(EXCEL对象的名称)appname.quit();即可有效地关闭EXCEL对象及其进程。

    若未有效关闭EXCEL进程,则无论系统中含有几个EXCEL进程,则若在程序外打开EXCEL,往往打开两个一样的界面,即原来有一个隐藏的EXCEL显示出来了。


    但比较困难的是,若有此操作代码未有效关闭EXCEL进程,刚在后续关闭时较困难。可以手动在系统的进程管理中关闭,也可以在编写更复杂一些的代码进行关闭。



    
    
    
    
    
    
    
    
    
    
    
    
    展开全文
  • 项目开发环境: VS2010 NET2.0 透明界面美化,不规则界面,控件重写 1 登入界面  功能: 登入框验证,注册表记录用户及密码,进度条,winform登入信息保存 2 主界面  功能:透明界面美化, 透明...

    项目开发环境: VS2010   NET2.0

    透明界面美化,不规则界面,控件重写

     

     

    1 登入界面

      功能: 登入框验证,注册表记录用户及密码,进度条,winform登入信息保存

     

     

    2 主界面

      功能:透明界面美化, 透明按钮切换,用户信息传递,最大化,最小化,关闭,移动窗口,定时器,弹窗,页面传值

     

     

    3 右下角浮动弹窗

      功能:透明界面美化, 透明按钮切换,关闭,移动窗口,页面传值

     

    项目下载地址:http://files.cnblogs.com/haiyabtx/WinForm_Demo.rar    技术交流QQ:37149283

    转载于:https://www.cnblogs.com/haiyabtx/archive/2012/10/20/2732007.html

    展开全文
  • WinForm_项目实战

    2011-04-14 16:51:09
    包括定时关机、媒体播放器、照片小管家、网络扫描器、俄罗斯方块、简易的IE浏览器修复器。
  • 1、界面层的项目搭建 我们从前面两篇随笔的介绍中,可以大概了解到界面层以下所发生的事情,本篇继续这一趋势,介绍界面层的开发内容。 首先我们创建一个Windows Application项目,使用VS2010(其他版本也可以)...

     

    1、界面层的项目搭建

    我们从前面两篇随笔的介绍中,可以大概了解到界面层以下所发生的事情,本篇继续这一趋势,介绍界面层的开发内容。

    首先我们创建一个Windows Application项目,使用VS2010(其他版本也可以)创建的Windows应用程序项目,然后把它们的项目目标框架和输出类型修改一下,如下所示。

    然后删除自动生成的所有窗体和类库代码,界面最后成为如下的内容。

    这样做的本意,是把这个界面部分作为一个独立的模块,我们在启动程序框架里面就可以很方便把它包含进来使用,因为我们知道,我们每次开发的业务可能都只是属于一个大的项目中的某部分模块,按模块的划分来进行开发,有方便管理维护、方便整合使用等特点。

    最终在主体界面中整合的是一个个模块,每个模块里面又有不同的窗体界面可供使用,大概的界面模块组合图形如下所示。

    2、业务模块的Winform界面的生成

    从第一小节中可以搭建一个干净的界面项目模块,但是里面还没有任何的内容,这就需要我们进一步生成或者手工编写我们所需的界面内容了。

    为了加快效率,减少界面控件名称的琐碎设置,减少对象赋值的代码编写,我们一般建议采用工具来进行界面的生成,如下界面所示。

    使用代码生成工具生成的界面,命名和数据库字段名称对应,统一风格,减少出错的几率,提高开发效率。

    通过以上设置的界面,设置我们在列表界面里面的查询条件内容,以及需要显示的字段内容;和编辑、新增对象界面的数据内容,然后我们就可以生成相关的窗体界面了。

    单击“Windows界面代码生成”后,生成的窗体界面文件如下所示,分为了两个部分,一个是列表界面,一个是数据编辑界面,通过手工的做法,我们也建议把新增、编辑数据这样合并处理,这样可以减少大项目模块的代码文件。

    把相关的界面内容复制到刚才创建的空项目工程上,并添加相关的类库应用,如框架需要支持的界面基类,公用类库等必备的程序集,这也是我们常见的开发操作了,再次不在赘述。

    最后界面层的项目截图如下所示。

    3、窗体界面的调整处理

    一般来说,自动生成的界面,可能或多或少需要进行手工的一些处理,如可能一些类库没有添加应用,关联的项目没有添加进来等原因,或者是数据类型转换的问题,不过一般问题很小,稍微处理下就能解决的。

    下面我们来对自动生成的窗体界面进行一定的调整,以方便我们的数据显示和处理。

    自动创建的列表界面打开如下所示。

    粗看我们应该觉得还是挺标准的列表界面,但是为了更好看,更统一,我们还是需要进行一些微调,如由于年龄是数值型,这里查询条件有两个作为一个区间进行组合查询的;另外,每个查询条件的控件宽度默认是会自动缩放的,由于条件较少,我们还是把它设置为固定宽度较好,最终我们稍微美化调整后的窗体界面如下所示。

    搞定列表界面,下面我们再来看看数据的编辑界面部分,数据编辑界面生成的效果如下所示(由于版面的原因,我把它进行了一定的缩小)。

    我们看到,里面的字段说明,控件的名称等内容,都已经合理安排好了,基本上设计数据库的时候,指定的字段备注就能正确生成出来了。

    这里演示的表字段比较少,因此可能排版布局方面没有很好的演示效果,不过我们知道DevExpress本身的LayoutControl布局很强大,我们可以随意调整里面控件的位置。

    对于控件的类型,也可以进行不同类型的转换,如可以吧文本类型,转换为数值类型的输入控件等等。

    这样简单的界面可能很多读者会说,这个我自己添加几个控件就可以了,也很快的,但是如果对于需要显示的界面控件(数据库字段很多)的情况下,如果控件显示内容、控件名称、布局位置,全部都要手工操作调整,那么这个工作量是非常惊人的。

    我在开发自己的一个项目程序《客户关系管理系统》的时候,里面的业务很多表的字段都不少,我就只需要拖动,调整下位置或者增加一些特别的控件进行合理展示即可,不需要去调整太多内容,这样可以为我节省大量的界面开发时间,更重要的是,减少出错的几率。

    如对于《客户关系管理系统》客户联系人这个表,字段不少,生成的界面很多控件,默认都是单排的,我根据需要,把他们进行再次排列,并增加一个TabControl选项卡的控件,以便放置更多的内容,和进行必要的区分,详细调整后的界面效果如下所示,这个就是一个复杂界面调整的一个好的案例说明了。

    4、整合业务逻辑层到界面项目

     我刚才在设计编译界面层的时候,是在界面项目引用的地方,把业务逻辑层的项目工程包含到引用里面了,如下所示。

    这样的引用操作是没什么问题,但是我们的项目组件如果拆分的较多,每个界面还需要带着一个业务逻辑的程序集,那么程序集DLL的数量就会翻倍,不便于管理。

    我的意思就是把他们全部进行整合,避免文件过于零散,但是最好避免到处复制文件的局面,这样增加维护成本,不是我们希望看见的。

    基于上面的两种考虑,我们可以在界面项目里面添加文件“链接”的操作,也就是代码文件的影子,编译的时候,他们是编译整合到程序集里面的,但是我们维护的时候,它们所有的”链接“引用,都是指向同一个文件,不会造成多处复制的问题。

    最终的项目构成如下所示,并顺利可以通过编译,这样我们在使用这个Customer的业务模块的时候,只需要一个界面部分的程序集(WHC.TestProject.UIDx.DLL)即可。

    转载于:https://www.cnblogs.com/ysz12300/p/5283542.html

    展开全文
  • winform 与 html 交互 简单案例

    千次阅读 2014-08-14 15:35:14
    1.新建一个winform项目,若要在winform中加载html,需要一个webBrowser控件。 2.新建一个html页面,这里命名为“test.htm”. 3.c#代码: //为了使网页能够与winform交互 将com的可访问性设置为真
  • WinForm 调用 WebApi 入门案例

    千次阅读 2019-04-15 10:28:11
    WinForm 调用 WebApi 入门案例 加载显示页面调用Load方法 private void Form1_Load(object sender, EventArgs e) { load(); } public void load() { **//url 你的WebApi 地址重要!!!** ...
  • 第11章项目案例:酒店管理系统…… 错误!未定义书签 111训练技能点…… 错误未定义书签。 112需求说明 错误!未定义书签 113设计与思路分析 错误未定义书签 113.1系统功能分析 错误!未定义书签。 1132数据库设计 错误!...
  • 基于WinForm开发的Ribbon界面案例

    千次阅读 2018-10-19 11:56:26
    使用 Winform开发插件或软件时,创建Ribbon界面是比较难的,大部分第三方Ribbon控件不是针对WPF开发的 就是不能免费授权,以下的AERibbonControl库 是自定义开发的 可以免费使用 可以满足大部分的需要,后续将持续...
  • C# WinForm有没有一些案例、课程设计、实战项目类的书籍,将一个个项目按照具体类的划分、设计来组织代码的,最好每一个项目都是几个到十几个类的规模,并有类图,体现设计思想。 我查了几本书,发现基本上是按照...
  • 原文地址:http://www.cnblogs.com/zeroLove/p/3912460.html 一定要看到最后!! 本文主要简单的记录... 1.新建一个winform项目,若要在winform中加载html,需要一个webBrowser控件。 2.新建一个html页面,这里...
  • WinForm

    2013-06-02 22:16:00
    案例:截取字符串前5个,string s2 = s1.Substring(0, Math.Min(s1.Length, 5));//取字符串的长度和5中的最小值来截取。谁小取谁。  bool Contains(string value)判断字符串中是否含有子串value  bool Starts...
  • 一、课程介绍 关于如何实现“WinForm多语言版本”网上有很多实现技术方案,可以说是“琳琅满目”,"包罗万象"。俗话说的好:一千个读者就...阿笨结合的是自己在实际工作中遇到真实项目案例,特别的总结并且分享出来...
  • 我们往往需要一些简单的的案例代码,基于此目的我把Winform开发框架中各种闪光点和不错的功能,有些是我们对功能模块的简单封装,而有些则是引入了一些应用广泛的开源组件进行集成使用,因此把它们做了一个Demo进行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,390
精华内容 956
关键字:

winform项目案例