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 Form1()
{
InitializeComponent();
}
【2】部分类(partial)
当两个类在同一个命名空间下,类名称一样,但是使用partial关键字后,就意味着了两个类看着是两个类
其实是一个类的不同的部分。
目的:当一个类的内容太多的时候,我们编写和查找都容易出现不便。为了更好的管理类的代码,在vs2005
的时候出现了部分类。
{
public Form1()
{
InitializeComponent();
}
【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);
{
【4】窗体的两个事件,大家无比掌握,并且学会窗体关闭前的确认逻辑是如何处理的。
{
两个窗体关闭事件: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 }