Winform入门

关于winForm开发说明

【1】应用集中性:国内的C#上位机开发,HIS,ERP,MRP,二次开发,GIS等,几乎都是C#开发的!

【2】学习必要性:是.NET平台和非.NET平台最早出现的,学好C#开发的必备。

1.项目UI设计

【1】C/S项目:首选是Winform原生控件(简单实用,但效果不太美观),直接拖放控件

              第三方控件库:免费的控件库

              WPF(界面设计上是最漂亮的,但是,学习成本较高)

              自己动手设计UI:自定义控件(局限性:屏幕自适应较差)

【2】B/S项目:HTML5原生设计(CSS+DIV)太麻烦,但是性能非常高!

              jQueryUI,Extjs,EasyUI....

              BootStrap框架(响应式设计,非常流行)

              LayUI框架(学习简单,上手快,效果好,一般后台应用较多)

2.常见的项目类型

【1】控制台程序(主要是学习使用)

【2】WinForm程序(Window程序,桌面程序,C/S程序,客户端程序)

【3】Web程序和分布式服务程序(asp.net-webform,asp.net-mvc,webservice,webapi,wcf)

3.不同项目部署差异

【1】Winform程序:我们.NET开发程序,可以直接把生成的文件拷出来就能用了。不需要单独的安装包,我们打包程序

                  仅仅是把程序模块集中到一起而已,对注册表没有任何的修改。

                  部署:第一,如果有数据库,数据库会在专门的服务器上。

                        第二,应用程序,在独立的客户端电脑上。(通常会有多个客户端)

                        第三,项目升级服务器。

【2】Web程序:我们开发的程序,通常只有一个服务器,通过IIS部署到服务器上,客户端其实就是浏览器。

              部署:第一,数据库通常是独立的服务器。

                    第二,应用程序,在独立的服务器上。

4.Winform程序设计

【1】项目结构

     1.Properties文件夹:AssemblyInfo程序集信息的配置类(通常项目正式发布后,存储项目版本版权项目相关信息)

     2.窗体文件Form1

       包括:Form1.cs

             Form1.Desinger.cs

两个类的定义:

public partial class Form1 : Form (双击窗体)
    {
        public Form1()
        {
            InitializeComponent();
        }

    }
partial class Form1
{
    //其他内容省略
}
结论:两个类的类名是完全一样的。
 

【2】部分类(partial)

当两个类在同一个命名空间下,类名称一样,但是使用partial关键字后,就意味着了两个类看着是两个类

其实是一个类的不同的部分。

目的:当一个类的内容太多的时候,我们编写和查找都容易出现不便。为了更好的管理类的代码,在vs2005

的时候出现了部分类。

public partial class Form1 : Form (双击窗体)
    {
        public Form1()
        {
            InitializeComponent();
        }
    }
这个类里面的代码,主要是我们自己写的。
下面是Designer文件中的代码
partial class Form1
{
    //其他内容省略
}
这里面主要是VS自动生成的代码
好处:可以不同的人编写的同一类,当然目的是更好的对代码进行分类管理。最后还能编译成一个类。
建议:不要轻易添加窗体的部分类。我们开发的一个建议:当我们这个类的内容太多的时候,请大家按照OOP原则
将类的内容再次细分, 封装到其它类中。

【3】常用控件

按钮控件:当我们在窗体中添加一个Button后,其实是VS自动的根据Button类帮我们创建一个按钮对象,并自动

设置了相关属性。

private System.Windows.Forms.Button button1;这个说明按钮是窗体对象里面的一个成员变量(对象)。

当我们通过属性窗口修改完控件的属性后,后台代码会自动修改:

 

1this.btnTest.Location = new System.Drawing.Point(84, 60);
2this.btnTest.Name = "btnTest";
3this.btnTest.Size = new System.Drawing.Size(75, 23);
4this.btnTest.TabIndex = 0;
5this.btnTest.Text = "启动按钮";
6this.btnTest.UseVisualStyleBackColor = true;

 

 建议:不要随便的手动从后台修改。但是,我们如果需要动态的创建控件,我们通常会自己先添加一个控件,设置属性后把这些代码复制到我们的相关的方法中,通过动态修改属性,来实现控件的动态控制。

我们在添加一个下拉菜单控件

 1            // Form1
 2            // 
 3             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
 4             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
 5             this.ClientSize = new System.Drawing.Size(800, 450);
 6             this.Controls.Add(this.comboBox1);
 7             this.Controls.Add(this.btnTest);
 8             this.Name = "Form1";
 9             this.Text = "Form1";
10             this.Load += new System.EventHandler(this.Form1_Load);
11             this.ResumeLayout(false);

我们还发现在Form1中窗体的设置多了两个内容:

this.Controls.Add(this.comboBox1);
this.Controls.Add(this.btnTest);

以上说明,我们窗体本身就是一个容器。窗体上所有的控件,都要添加到Controls集合中。

如果我们在窗体中添加其他的容器,比如panel,groupbox等等,这些首先被添加到Form的Controls集合中。

但是如果我们在panel等这些容器中添加空间的时候,控件会加到他所在的第一级容器中。

启动窗体

 

 1 static class Program
 2     {
 3         /// <summary>
 4         /// 应用程序的主入口点。
 5         /// </summary>
 6         [STAThread]
 7         static void Main()
 8         {
 9             Application.EnableVisualStyles();
10             Application.SetCompatibleTextRenderingDefault(false);
11             Application.Run(new Form1());
12         }
13     }

 

在这里是程序的入口,我们发现 Application.Run(new Form1());这句话告诉我们Form1窗体是作为项目的启动窗体

启动窗体就是意味着项目的主线程运行,当我们关闭Form1窗体的时候,整个项目会退出。我们可以根据需要修改这个启动窗体。

无边框窗体设计

 

方法:

1.窗体边框去掉。然后自己设计“边框”和颜色。 

2.窗体大小,必须提前设计好。

3.控件要扁平化处理。

 

 Event事件(我们还要学习很多的内容,委托-->事件:高级内容)

在.NET平台上面,给我们所用的这些控件,封装了很多事件,就是对用户操作的某一个行为,进行封装。

比如,当用户单击一个按钮的时候,单击这个动作,已经被封装成Click事件,那么我们只要把这个事件拿出来,

当用户出发单击这个动作的时候,也就是这个事件被调用了,我们就可以在这个事件中,完成我们需要的任务。

看下面两行代码:

this.btnTest.Click += new System.EventHandler(this.btnTest_Click);

private void btnTest_Click(object sender, EventArgs e)
{
}
这两行代码是将控件的Click事件和事件方法关联。只要保证两个话颜色的代码指向相同的事件名称就可以了。
sender:表示当前控件的对象。
this.btnTest.Click -= new System.EventHandler(this.btnTest_Click); //接触事件关联
要求学会:
【1】能够找到我们需要的控件事件。
【2】根据事件生成事件方法,并且编写业务逻辑。
【3】如果事件不在需要,要知道如何把时间关联(委托)删除和时间方法删除。

【4】窗体的两个事件,大家无比掌握,并且学会窗体关闭前的确认逻辑是如何处理的。

private void Form1_Load(object sender, EventArgs e)
 {
 }
窗体所有控件和初始化完毕后要执行的事件,我们通常不用。我们想完成控件或初始化内容,请在构造方法中写。

两个窗体关闭事件:FormClosing和FormClosed

FormClosing:窗体关闭之前发生的。

FormClosed:窗体关闭之后发生的。

事件的集中响应

原理:就是相同的控件,可以关联同一个事件响应的方法。

记住以下代码:

 1         foreach (Control item in this.Controls)
 2         {
 3             if (Item is Button)  //通过控件类型过滤掉我们不需要的控件
 4             {
 5                 Button btn = Item as Button;
 6                 if (btn.Tag.ToString() != "Save")  //过滤我们不需要的按钮,请大家特别注意Tag的使用
 7                 {
 8                     btn.Click += new System.EventHandler.(this.btn_Click);
 9                 }
10             }
11         } 
12         private void btn_Click(object sender, EventArgs e)
13         {
14             Button btn = sender as Button;
15             MessageBox.Show(btn.Tag.ToString());
16         }

 

posted @ 2020-02-02 13:42  大勇者  阅读(1638)  评论(0编辑  收藏  举报