導航:首頁 > 編程語言 > winform編程實例

winform編程實例

發布時間:2023-05-29 16:10:35

⑴ C# 在winform上繪制一個點陣圖

可以再Form_Load
里激早雀面.但是必須先寫一句明早
:
this.Show();
比如:
this.Show();
Graphics
g
=
Graphics.FromHwnd(this.Handle);
g.FillRectangle(System.Drawing.Brushes.Red,
0,
0,
506,
600);
類似這樣,方可以
實現繪圖睜寬了..

⑵ 跪求! C# WINFORM應用程序對Excel 文件 編輯創建的 代碼實例

try
{
Excel.Application xls = new Excel.Application();
Excel.Workbook editBook = null;
Excel.Worksheet editSheet = null;
Excel.Workbooks excelBooks = (Excel.Workbooks)xls.Workbooks;
Workbook editBook = excelBooks.Open(excelPath, Type.Missing, true, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
editSheet = editBook.Sheets[1] as Excel.Worksheet;
Excel.Range targetCell = editSheet.get_Range("A1", "A1");
targetCell.Value2 = "要設定的值";
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(targetCell);
System.Runtime.InteropServices.Marshal.ReleaseComObject(editSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(editBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelBooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xls);
}

⑶ C# winform動態創建多線程

1 private void Form1_Load(object sender, EventArgs e)
2 {
3 Thread newthread = new Thread(new ThreadStart(BackgroundProcess));
4 newthread.Start();
5
6 }
7
8 /// <summary>
9 /// 定義一個代理
10 /// </summary>
11 private delegate void CrossThreadOperationControl();
12
13 private void BackgroundProcess()
14 {
15 // 將代理實例化為一個匿名代理
16 CrossThreadOperationControl CrossDelete = delegate()
17 {
18 int i = 1;
19 while (i < 5)
20 {
21 // 向列表框增加一個項目
22 listBox1.Items.Add("Item " + i.ToString());
23 i++;
24 }
25 label1.Text = "我在新線程里訪問這個lable!";
26 listBox1.Items.Add(label1.Text);
27 };
28 listBox1.Invoke(CrossDelete);
29 }

收集一下,在C# winform編程中多線程操作控制項時,可以有下面種方法:
1. 又看到一種方法(2014.1.6):

1. 剛看到一種方法(2014.1.5):

1 private void btnTest_Click(object sender, EventArgs e)
2 {
3 if (this.txtIP.Text.Trim() != "" && this.txtPort.Text.Trim() != "")
4 {
5 string proxy = this.txtIP.Text.Trim() + ":" + this.txtPort.Text.Trim();
6 string result = string.Empty;
7 this.btnTest.Enabled = false;
8 new Thread(delegate
9 {
10 Stopwatch stopwatch = new Stopwatch();
11 stopwatch.Start();
12 HttpClient httpClient = new HttpClient();
13 httpClient.Proxy = new WebProxy(proxy);
14 httpClient.TimeOut = 2000;
15 object result;
16 try
17 {
18 string a = httpClient.Get("http://www..com", "", "", "", "", "get");
19 if (a != "")
20 {
21 result = "響應成功!";
22 }
23 else
24 {
25 result = "響應失敗!";
26 }
27 }
28 catch
29 {
30 }
31 stopwatch.Stop();
32 result = result;
33 result = string.Concat(new object[]
34 {
35 result,
36 ",響應花費:",
37 stopwatch.ElapsedMilliseconds,
38 "ms"
39 });
40 this.BeginInvoke(delegate
41 {
42 this.lbResult.Text = result;
43 this.btnTest.Enabled = true;
44 });
45 })
46 {
47 IsBackground = true
48 }.Start();
49 }
50 else
51 {
52 this.lbResult.Text = "請輸入完整再提交!";
53 }
54 }

1. 直接使用表達式和Action()

1 private void btnInitEnv_Click(object sender, EventArgs e)
2 {
3 //初始化環境時回顯出來的文字不讓看
4 try
5 {
6 this.textBoxOutPut.Clear();
7 this.btnInitEnv.Enabled = false;
8 this.labelStateInfo.Text = "";
9 this.labelStateInfo.ForeColor = Color.Red;
10
11 if (!WriteToSerialPort("diags"))
12 {
13 this.btnInitEnv.Enabled = true;
14 return;
15 }
16
17 Thread thread = new Thread(new ThreadStart(() =>
18 {
19 int i = 0;
20 bool flagFind = false;
21 StringBuilder sb = new StringBuilder();
22
23 while (true)
24 {
25 Thread.Sleep(300);
26 this.Invoke(new Action(() =>
27 {
28 sb.Append(this.textBoxOutPut.Text);
29 this.textBoxOutPut.Clear();
30 if (sb.ToString().Contains("Entering recovery mode, starting command prompt"))
31 {
32 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
33 DateTime.Now.ToString(PubilcConstVar.TimeFormat),
34 "Entering recovery mode, starting command prompt, Stop.\r\n"));
35 this.labelStateInfo.ForeColor = Color.Red;
36 this.labelStateInfo.Text = "初始化失敗,請手動輸入命令初始化";
37 flagFind = true;
38 this.btnInitEnv.Enabled = true;
39 }
40 else if (sb.ToString().Contains(":-)"))
41 {
42 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
43 DateTime.Now.ToString(PubilcConstVar.TimeFormat),
44 "進入操作模式成功\r\n"));
45 this.labelStateInfo.ForeColor = Color.Blue;
46 this.labelStateInfo.Text = "初始化成功";
47 flagFind = true;
48
49 //將業務按鈕使能
50 EnableBussinessButtons();
51 }
52 }));
53
54 if (flagFind || ++i > 20) //找開標志或10秒超時中斷
55 {
56 break;
57 }
58 }
59
60 if (!flagFind)
61 {
62 this.Invoke(new Action(() =>
63 {
64 this.textBoxOutPut.Clear();
65 this.labelStateInfo.ForeColor = Color.Red;
66 this.labelStateInfo.Text = "初始化失敗,超時";
67 this.btnInitEnv.Enabled = true;
68
69 DisableBussinessButtons();
70 }));
71 }
72 }));
73
74 thread.IsBackground = true;
75 thread.Start();
76 }
77 catch (Exception ex)
78 {
79 this.log.Write(ex.ToString());
80 }
81 }

2. 使用線程函數加action()

1 private void btnInitEnv_Click(object sender, EventArgs e)
2 {
3 //初始化環境時回顯出來的文字不讓看
4 try
5 {
6 this.textBoxOutPut.Clear();
7 this.btnInitEnv.Enabled = false;
8 this.labelStateInfo.Text = "";
9 this.labelStateInfo.ForeColor = Color.Red;
10
11 if (!WriteToSerialPort("diags"))
12 {
13 this.btnInitEnv.Enabled = true;
14 return;
15 }
16
17 Thread thread = new Thread(new ThreadStart(MonitorOutPutThread));
18
19 thread.IsBackground = true;
20 thread.Start();
21 }
22 catch (Exception ex)
23 {
24 this.log.Write(ex.ToString());
25 }
26 }

線程函數:

1 private void MonitorOutPutThread()
2 {
3 int i = 0;
4 bool flagFind = false;
5 StringBuilder sb = new StringBuilder();
6
7 while (true)
8 {
9 Thread.Sleep(300);
10 this.Invoke(new Action(() =>
11 {
12 sb.Append(this.textBoxOutPut.Text);
13 this.textBoxOutPut.Clear();
14 if (sb.ToString().Contains("Entering recovery mode, starting command prompt"))
15 {
16 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
17 DateTime.Now.ToString(PubilcConstVar.TimeFormat),
18 "Entering recovery mode, starting command prompt, Stop.\r\n"));
19 this.labelStateInfo.ForeColor = Color.Red;
20 this.labelStateInfo.Text = "初始化失敗,請手動輸入命令初始化";
21 flagFind = true;
22 this.btnInitEnv.Enabled = true;
23 }
24 else if (sb.ToString().Contains(":-)"))
25 {
26 this.textBoxOutPut.AppendText(string.Format(PubilcConstVar.TerimalStrFormat,
27 DateTime.Now.ToString(PubilcConstVar.TimeFormat),
28 "進入操作模式成功\r\n"));
29 this.labelStateInfo.ForeColor = Color.Blue;
30 this.labelStateInfo.Text = "初始化成功";
31 flagFind = true;
32
33 //將業務按鈕使能
34 EnableBussinessButtons();
35 }
36 }));
37
38 if (flagFind || ++i > 20) //找開標志或10秒超時中斷
39 {
40 break;
41 }
42 }
43
44 if (!flagFind)
45 {
46 this.Invoke(new Action(() =>
47 {
48 this.textBoxOutPut.Clear();
49 this.labelStateInfo.ForeColor = Color.Red;
50 this.labelStateInfo.Text = "初始化失敗,超時";
51 this.btnInitEnv.Enabled = true;
52
53 DisableBussinessButtons();
54 }));
55 }
56 }

⑷ 求一個c#winform滑鼠輪滾動即可彈窗的實例

在事件鋒悶余中選擇MouseWheel事件進行編輯
或在設計器代碼中
this.MouseWheel += new MouseEventHandler(Form1_MouseWheel);

然罩帆後實現方法
private void Form1_MouseWheel(object sender, MouseEventArgs e)
{
MessageBox.Show("test");
}

如果是其中的控制項獲得焦點則不可用,為此銀滾目的可採用
this.Focos();
添加到某些控制項的Enter事件中使窗體本身獲得焦點

⑸ 可以給個強大的winform父子窗口實例嗎.謝謝

1,首先,父窗口要設置isenablemdi屬性。實現MDI結構的父子窗口套用,最重要的是在父窗口實例化自窗口(例frmForm),(名字好像有些錯誤)
FrmForm frmFom=new FrmForm();
frmForm.parent=this;
2,關於自窗口在父窗口中的自動排列,C#提供一個父窗口屬性定義,(好像是mdiLayout),通過設置這個屬性即可實現層疊、橫向、縱向排列(大於三個子窗口時自動調稿譽核整為平均分配的窗口排列)。
3,我當時調的時候只用三個窗口,所以只看到橫向或縱向排列的情況,不知道Vertical和H...在大於三個時可以均勻排布(如左邊三個,右邊三個)。於是就自己寫了一個小演算法,也實現了功能;
我的實現方法:
a,利用parentForm.width和parentForm.height以及可以確定的其它控制項的大小,計算得到mdi窗口大小
b,根據mdi子窗口數量計算平均每個窗口的面積
c,從(0,0)開始逆序從上往下,從左到右處理每個窗口鍵掘的location,並把size設置為平均面積(最後查看的窗口在最前面)
這當中有幾個細節
a,用arraylist 保存打開的mdi自窗口信息,方便管理和配置(如location,size配置,非常方便)
b,對於奇數個的情況,算平均時窗口數+1;虛畝給最中間的窗口的size*2,使其橫向鋪在最下面,面積為平均值的兩倍

其實這些東西樓主經常去CSDN很容易就懂的,我的這個答案也是在CSDN上找的。

⑹ 關於 C#編寫的WINFORM程序

Program.cs 一般不寫代碼,沒特殊需要不寫(本人還沒碰到過要在program中寫代碼的)program只是個程序入口,完全有編譯器生成,樓主可以不管
From是主要代碼所在地。From分成三塊,一塊是界面編輯,一塊是界面編輯代碼,界面編輯代碼一般也有編譯器生成,在你進行界面操作的時候編譯器會自動生成,在這里你也不要寫代碼,當然有特殊需要也是可以的。第三塊就是form.cs,這里是你主要代碼的地方,你添加的事件什麼的都要寫在這里。一般的話你雙擊form就會進去form.cs,同時會生成一個load事件,在這個事件里你可以進行一些初始化要做得事,其他就不一一說了,樓主自己體會啊。
在c#form1就是一個類,要用form就要new一個實例。當然在progrm中就有,在main中new了,這個你看下程序就知道了。
另外有一個功能的實現你要添加一個類,在這個類中尼也要寫不少代碼的,樓主開始做後一定會有體會的

⑺ 二、設計WinForm應用程序,實現用戶登錄信息判斷,如下圖所示。

如果你一個都不會的話你還是自己再慢慢研究。你所說的要求是編程的最低要求!一定要自己動手!給你一點思路:登錄窗口:當點擊登錄時候判斷textbox.text==「」;則提示不填寫用戶名(或密碼)。注冊窗口:有必要填寫textbox.text不為空且用戶名不重復,則點擊「注冊」即可注冊成功並資料庫插入該記錄。其他的還是自己琢磨的好,VS對基本的這些功能實現是非常容易的!===================================================================下面給你一個完整的登錄界面代碼在VS2005.NET平台下用C#和Access實現用戶登錄界面的窗體應用程序一直就想加個technology的類別,但卻遲遲未能動筆.一來坦游亮不得不承認直到現在,我在技術上還依然只是一個沒怎麼入門的菜鳥,二來技術本身也不是我的興趣所在.但不管怎樣,既然我現在還要攻讀計算機專業磨輪的碩士學位,那麼技術,總還是要學的.需要說明的是,對於那些高手來說,這里的東西想必都是小菜一碟,不值一提.我寫在這里,只是給自己的總結吧.另外我所寫的東西,很多也是參考網路和書籍的,其實真正屬於我自己的東西也不多.由於四處查找,具體的出處很多也已記不清了,而且在開源環境下也很難說某些代碼就是誰的原創,所以這里雖然沒有說明,但很多東西也都是參考他人的,在此先要對那些給了我幫助的書籍作者,網上的發貼人和回貼人表示感謝.去年研一剛開學時,自己的實踐能力還幾乎為零.因為我心裡清楚,自己本科的確是混過來的讓寬,計算機科學與技術的學士學位,我其實是不配去拿的.九月十號進實驗室後,開始學習項目組里需要用到的C#,但單純學習語言也沒什麼明確的目的性.實驗室里和我同一導師本校保研的同學和我說起,他們大四下學期剛進實驗室時,師兄就讓他們先試著寫一個類似QQ登錄那樣的一個用戶登錄程序.我自己沒有任何經驗,想也就像他們一樣,從這里起步吧,於是在看C#的同時我就考慮怎麼樣去實現這樣一個程序了.我知道對於過來人來說,這樣的一個程序實在是再簡單不過了,但對於當時剛開始的我,著實費盡了不少周折.雖然後來基本實現了這樣一個程序,但在資料庫上還是有些問題.因此雖然當時也曾想過貼個technology類別的日誌,但終究還是一直拖了下來.前段時間通過同學的介紹,幫沈陽日報的一個朋友做了一個會員管理的軟體.軟體本身也極其簡單,基本沒有太多的技術含量,但在開發的過程中自己通過各種渠道去查找資料,也在各方面都學到了很多.所以這段經歷對我還是很有意義的.而且自己在計算機專業學了四年有半後終於可以自己做出來一些可以應用到實際中的東西,也終於憑借自己的專業能力獲得了一點回報,無論回報是多是少.嗯,是要鼓勵一下自己的.也激勵自己再接再厲!此後我可能會把在這一軟體中所學到的東西陸續總結一下到這里.而這一軟體開發的第一個模塊也就是用戶登錄模塊.也就是我最初在嘗試做的東西.好,說了這么多無關的話,現在言歸正傳,來看登錄模塊的具體實現.由於用戶登錄模塊的實現關鍵的一點就是要將用戶的信息存儲在資料庫中,並在用戶登錄時到資料庫中對信息進行查找和核對,所以首先要先建立一個資料庫.實際上對於初學者來說,資料庫的相關操作也正是實現本登錄模塊的難點所在.這也是當時我剛開始寫這段程序時困擾我並困擾了我很久的地方.在數據量不是很大的情況下,可以就用微軟Office組件里的Access資料庫,比較方便.這里在D盤用Access建立一個資料庫命名為db.mdb,並在資料庫中建一個表,命名為users,在表中建兩個欄位,命名為userName和userPassword,分別存儲用戶名和密碼.然後在表中插入幾條數據,用於登錄界面的測試.下面是登錄模塊的開發.在VisualStudio2005的C#開發環境下,新建一個Windows應用程序的項目,將第一個窗體命名為Login,即作為用戶登錄窗體.在窗體上添加相應控制項,設計效果如下:其中兩個文本框分別命名為userNameTbx,pswTbx,用於接收用戶輸入的用戶名和密碼,兩個按鈕命名為loginBtn,cancleBtn,用於用戶提交登錄信息或取消以關閉登錄框.將文本框pswTbx的PasswordChar屬性設置為*或其它字元,這樣用戶在該文本框中鍵入字元時,界面顯示的一律為*.然後在項目中添加一個Windows窗體,命名為MainForm,對於實際使用的軟體來說,當用戶登錄成功後都應該彈出這樣的軟體主窗體.這里只是實現登錄功能,暫不對主窗體添加任何內容.下面就是登錄界面的後台實現,主要就是用戶點擊login按鈕後後台事件響應代碼的編寫.登錄窗體後台代碼如下:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Data.OleDb;//添加Access資料庫相關操作所需的引用namespaceLoginTest{publicpartialclassLogin:Form{publicLogin(){InitializeComponent();}privatevoidloginBtn_Click(objectsender,EventArgse){//用戶點擊loginBtn後事件響應的代碼//用來連接Access資料庫的字元串,@的作用是避免"\"等字元被當成轉義符stringconStr=@"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=D:\db.mdb";OleDbConnectioncon=newOleDbConnection(conStr);con.Open();stringcmdStr="select*fromuserswhereuserName='"+this.userNameTbx.Text+"'anserPassword='"+this.pswTbx.Text+"'";OleDbCommandcmd=newOleDbCommand(cmdStr,con);OleDbDataReaderreader=cmd.ExecuteReader();if(reader.Read())//如果找到用戶信息,說明登錄成功{MainFormnewForm=newMainForm();newForm.Show();//彈出主窗體this.Hide();//隱藏用戶登錄窗體}else{MessageBox.Show("用戶名或密碼錯誤!");}reader.Close();cmd.Connection.Close();con.Close();}privatevoidcancleBtn_Click(objectsender,EventArgse){this.Close();}}}以上代碼調試通過後,即可成功運行.當輸入資料庫中正確的用戶名和密碼後點擊login,則登錄窗體關閉,主窗口彈出.大功告成!大功真的告成了嗎?且慢.當在調試狀態下啟動軟體,登錄成功彈出主窗體後再關閉主窗體,從用戶角度來說軟體應該關閉了.但程序卻還處在調試狀態而沒有結束運行.即使不在調試狀態下,關閉主窗體後似乎軟體已經關閉了,但實際上打開Windows任務管理器,發現登錄窗體的線程還一直處在運行狀態.這顯然是不完善的.檢查後發現在上面的代碼中,彈出主窗體後只是將登錄窗體隱藏了,this.Hide();而並沒有真正關閉.好,那在彈出主窗體後就把登錄窗體關閉吧.我們將this.Hide();改成this.Close();很簡單吧.但很遺憾,事情並沒有這么簡單.這樣改過之後我們再運行軟體,發現登錄成功之後登錄窗體的確是實實在在的關閉了,但主窗體在閃了一下,甚至你可能連閃那一下都沒看到,就也隨之關閉了.這顯然不是我們想要的結果.那如何能讓登錄窗體真正關閉,而又不影響主窗體的正常運行呢?這個問題也困擾了我了陣,當然還是很容易在網上找到了答案.實際上建立項目時登錄窗體是第一個窗體,也就是默認的啟動窗體,或者說是主進程,如果只將窗體隱藏,顯然進程一直運行.而或將窗體關閉,也就是將主進程關閉,那整個軟體自然也就關閉了,因此彈出的MainForm自然也會隨之關閉.當然關於進程的問題我還有待進一步學習.要解決這個問題,就要找到應用程序的入口,看看整個程序的執行過程.打開項目中的program.cs文件,發現代碼如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Windows.Forms;namespaceLoginTest{staticclassProgram{//////應用程序的主入口點。///[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.(false);Application.Run(newLogin());}}}要想解決上面的問題,就不能讓程序直接執行Application.Run(newLogin());,而可做如下修改.staticvoidMain(){Application.EnableVisualStyles();Application.(false);//Application.Run(newLogin());Loginlogin=newLogin();if(login.ShowDialog()==DialogResult.OK){login.Close();Application.Run(newMainForm());}}首先實例化一個登錄窗體,當登錄成功時返回DialogResult.OK的結果,然後關閉登錄窗體,將主窗體作為主線程啟動.相應的,在登錄界面的代碼文件中做如下修改:if(reader.Read()){//MainFormnewForm=newMainForm();//newForm.Show();//this.Hide();this.DialogResult=DialogResult.OK;}至此,我們完成了一個最基本的用戶登錄模塊的實現.最後,關於Access資料庫有幾點說明.第一,資料庫文件的位置.其實資料庫文件沒必要放到或復制到項目文件中,而在進行資料庫連接相關操作時直接使用其絕對路徑即可.實際上在實際使用軟體時,一般資料庫文件也不會和軟體的安裝文件放在同一目錄下的.最開始嘗試寫登錄模塊時,我就通過添加數據源什麼的把資料庫文件復試到了項目的Debug文件夾下,結果程序編譯時會產生很多數據覆蓋的問題,會有很多不必要的麻煩.另外一點就是Access資料庫雖然用得著比較方便,但凡事有其兩面性,Access資料庫也有一些不利之處,影響比較明顯的一點就是其可惡的關鍵字.這點也曾給我帶來不少麻煩.由於很多關鍵字都是Access資料庫保留的,因此在建表命名時如果一不小心和其重復了則對資料庫操作時就會失敗,而這一問題又很難發現,結果就是程序干調調不通卻找不到原因所在.因此在使用Access資料庫時命名一定要小心.附上轉自網上的」真爛Access關鍵字」,如果操作Access資料庫失敗了可以先看一下是不是命名與下面這些關鍵字重復

⑻ C#Winform編程,怎樣在一個窗口f1中調用另一個窗口f2 在f2中數據改變,在f1中相應的也改變

昨天也遇到了類似的問題,最後我的解液空塵決方法如下
在f2中寫一個
public f1 F1;

在f1窗口中實例鬧禪化f2的時候這樣寫
f2 F2 = new f2();
F2.F1 = this;
F2.ShowDialog();

當f2中數據改變時(假設改變的數據是在f2中是 int x; 在f1中是int y;)
F1.y = x;
這樣就可以了
主要思想就是把f1當做f2的一虧鉛個參數傳遞到f2中

閱讀全文

與winform編程實例相關的資料

熱點內容
特警力量同人小說 瀏覽:253
葉天明柳韻為主角的小說全文免費閱讀 瀏覽:929
比愛戀尺度大的電影 瀏覽:135
主人公叫楊凡的小說 瀏覽:860
在船上做皮肉生意的電影 瀏覽:655
倫理電影飛在天上的船 瀏覽:224
求個網址能在線看 瀏覽:549
美國古埃及電影 瀏覽:78
韓國電影成人學院演員有誰 瀏覽:957
美國大胸電影 瀏覽:140
主角重生老北京的小說 瀏覽:199
邵氏100部恐怖影片 瀏覽:101
青春期2裡面的跳舞的歌 瀏覽:37
國產動作愛情片 瀏覽:420
韓國有部特種兵與護士的電影 瀏覽:662
《貪婪》中的日本女演員 瀏覽:477
男主得艾滋病的電影 瀏覽:807
罪孽船長泰國版在線觀看 瀏覽:194
外國電影一個黑男孩在深林 瀏覽:903
叔嫂不倫之戀電影 瀏覽:211