關於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 }