買(mǎi)了域名之后怎么做網(wǎng)站網(wǎng)絡(luò)推廣公司企業(yè)
今日繼續(xù)我的C#winform上位機(jī)學(xué)習(xí)之路
這系列筆記的目標(biāo)是嘗試編寫(xiě)一個(gè)能夠與西門(mén)子PLC進(jìn)行以太網(wǎng)口通信的上位機(jī)軟件。
文章提供完整代碼解釋、設(shè)計(jì)點(diǎn)解釋、測(cè)試效果圖、完整工程下載
本章主要學(xué)習(xí):Winform多個(gè)窗體的一些操作 、無(wú)邊框窗體的創(chuàng)建、Combox組件插入枚舉類(lèi)型、日志委托的添加使用、
只是個(gè)人學(xué)習(xí)方面的筆記,如有疏漏實(shí)乃正常......
目錄
Winform 西門(mén)子PLC通信窗口的控件擺放與聲明:
Winform 添加新的窗口:
Winform多窗口設(shè)置窗口加載順序:
Winform去除窗口邊框:
按鍵操作TabControl調(diào)出新窗口:
按鍵清除Tabcontrol中的窗體內(nèi)容:
枚舉類(lèi)型與Combox控件的綁定:
日志的添加建立_綁定imagelist:
日志的添加建立_imaginelist添加成員:
listview編輯列屬性(日志時(shí)間內(nèi)容):
日志的添加使用:
winform常用圖標(biāo)庫(kù)下載:
網(wǎng)上資料查閱網(wǎng)址貼出:
Winform 西門(mén)子PLC通信窗口的控件擺放與聲明:
Form1()窗體設(shè)計(jì)控件如下:
ComboBox:CPU類(lèi)型、變量類(lèi)型
Button:連接PLC、讀取、寫(xiě)入
Textbox:IP地址、變量地址、讀取長(zhǎng)度、寫(xiě)入數(shù)值
RichTextBox:讀寫(xiě)信息
Winform 添加新的窗口:
先右鍵項(xiàng)目添加窗體:
然后可以進(jìn)行改名稱(chēng),并進(jìn)行添加:
新窗體控件擺放:
?tabControl和?button
前者用于確定框區(qū)大小,后者用于交互調(diào)出另一個(gè)表單
可以在屬性中查看框區(qū)大小,為設(shè)計(jì)做出便利:
Winform多窗口設(shè)置窗口加載順序:
現(xiàn)在我們項(xiàng)目中有了倆個(gè)窗口,但明顯我們希望新創(chuàng)建的串口MainForm是第一個(gè)運(yùn)行的,然后在Mainform的按鍵操作下再調(diào)出form1,那如何設(shè)置好Mainform先加載呢:
我們只需進(jìn)入Program.cs中,將原本的Form1()改為MainForm()即可 :
啟動(dòng)后發(fā)現(xiàn)確實(shí)變成MainForm的界面了:
Winform去除窗口邊框:
在實(shí)現(xiàn)接下來(lái)的設(shè)計(jì)之前,我們需要對(duì)form1進(jìn)行一些改進(jìn),主要是外觀(guān)上的改進(jìn):
然后去除其邊框:
最后別忘了改進(jìn)其大小,使其適合于之前的tabControl屬性中的大小:
按鍵操作TabControl調(diào)出新窗口:
?首先添加倆個(gè)函數(shù)方法:這倆個(gè)方法是寫(xiě)入MainForm項(xiàng)目中的:
//添加窗體實(shí)例進(jìn)Tabpage中public void Add_TabPage(string str, Form myForm) //將標(biāo)題添加進(jìn)tabpage中{if (!this.tabControlCheckHave(this.tabControl1, str)){this.tabControl1.TabPages.Add(str);this.tabControl1.SelectTab((int)(this.tabControl1.TabPages.Count - 1));myForm.FormBorderStyle = FormBorderStyle.None;myForm.TopLevel = false;myForm.Show();myForm.Parent = this.tabControl1.SelectedTab;}}public bool tabControlCheckHave(TabControl tab, string tabName) //看tabpage中是否已有窗體{for (int i = 0; i < tab.TabCount; i++){if (tab.TabPages[i].Text == tabName){tab.SelectedIndex = i;return true;}}return false;}
然后在按鍵中調(diào)用第一個(gè)函數(shù)的方法:
public void Add_TabPage(string str, Form myForm) //將標(biāo)題添加進(jìn)tabpage中
?這樣就可以實(shí)現(xiàn)按下“西門(mén)子”按鍵,就調(diào)出之前的Form1()窗體貼在tabcontrol里了:
按鍵清除Tabcontrol中的窗體內(nèi)容:
這里我也是進(jìn)行學(xué)習(xí)提升一下,
將按鍵的操作改進(jìn)為:第二次按下“西門(mén)子”就清除Tabcontrol中的內(nèi)容:
別忘了定義Bool型變量幫助按鍵的操作形成一個(gè)循環(huán):
bool button1_cg = false; private void button1_Click(object sender, EventArgs e){//第一次點(diǎn)擊會(huì)將 Form1()添加進(jìn)Tabcontrol中if (button1_cg==false){button1_cg = true;Add_TabPage("西門(mén)子", new Form1());}//第二次就會(huì)清除所有標(biāo)簽頁(yè)else if(button1_cg==true){button1_cg = false;// 假設(shè)你的TabControl的名字是tabControl1// 清除所有的標(biāo)簽頁(yè)while (tabControl1.TabPages.Count > 0){tabControl1.TabPages.RemoveAt(0);}}}
再次按下清空效果:
枚舉類(lèi)型與Combox控件的綁定:
在上篇文章我們提到了與西門(mén)子通信的庫(kù)xktcomm中,CPU類(lèi)型是一個(gè)枚舉類(lèi)型(enum):
而我們希望其枚舉的類(lèi)型合理地進(jìn)入到我們的Form1()窗體的Combox組件中去枚舉:
代碼實(shí)現(xiàn):
//表單初始化的類(lèi)public Form1(){InitializeComponent();this.Load += Form1_Load1;}private void Form1_Load1(object sender, EventArgs e){//加載cmb_CPUType組件的DataSource屬性//加載名稱(chēng)源GetNames是Enum數(shù)據(jù)類(lèi)型的xktComm.Common.CPU_Typethis.cmb_CPUType.DataSource = Enum.GetNames(typeof(xktComm.Common.CPU_Type));}
綁定后初始化效果展示:
?用同樣方式進(jìn)行變量類(lèi)型的枚舉綁定:
代碼如下:
//表單初始化的類(lèi)public Form1(){InitializeComponent();this.Load += Form1_Load1;}private void Form1_Load1(object sender, EventArgs e){this.cmb_CPUType.DataSource = Enum.GetNames(typeof(xktComm.Common.CPU_Type));this.cmb_VarType.DataSource = Enum.GetNames(typeof(xktComm.Common.VarType));}
效果如下:
日志的添加建立_綁定imagelist:
?回到設(shè)計(jì)界面,點(diǎn)擊組件右上角彈出listview:
添加新組件imagelist并綁定:
日志的添加建立_imaginelist添加icon成員:
第一次點(diǎn)擊imaginelist右上角的三角調(diào)出圖像集合編輯時(shí),是沒(méi)有圖像成員的,這里就需要添加了
文章末尾提供winform常用圖標(biāo)庫(kù)下載地址,這里我也是搜索到了需要的三個(gè)圖標(biāo),并放在了桌面
添加成功:
但我們發(fā)現(xiàn)有位成員是白色的,沒(méi)有圖標(biāo),這時(shí)點(diǎn)屬性知道它大小為64*64,而imaginelist設(shè)定的圖標(biāo)大小為16*16,這里改進(jìn)一下就行了:
?但計(jì)時(shí)這樣我還是發(fā)現(xiàn)沒(méi)解決問(wèn)題,最終我將一堆。ico文件導(dǎo)入看哪些正常、哪些不支持:
?然后選擇差不多元素的,按箭頭移位到位置替換了:
如果有大神知道如何將ico文件正確修改導(dǎo)入,希望能在評(píng)論區(qū)告知學(xué)習(xí)~~~~~~
最后提一嘴,別忘了將剛才的imaginelist的圖像屬性的64,64改回16,16,不然日志圖標(biāo)icon顯示會(huì)變得超級(jí)大:
listview編輯列屬性(日志時(shí)間內(nèi)容):
接下來(lái)繼續(xù)對(duì) 組件屬性進(jìn)行修改:
?點(diǎn)擊編輯列
就會(huì)看到日志的時(shí)間與內(nèi)容:
日志的添加使用:
日志的使用需要?jiǎng)?chuàng)建委托:
//info 表示報(bào)警級(jí)別 ,log 表示報(bào)警信息public delegate void AddLog(int info, string log);
添加AddLog的實(shí)際方法:
/*首先判斷是否需要通過(guò)Invoke調(diào)用該方法。如果不需要,則直接執(zhí)行下面的代碼。創(chuàng)建一個(gè)ListViewItem對(duì)象lst,用于存儲(chǔ)日志信息。使用DateTime.Now.ToString(“yyyy/MM/dd HH:mm:ss”)獲取當(dāng)前時(shí)間,并將其添加到lst中。將Log參數(shù)添加到lst的子項(xiàng)中。將lst插入到lstInfo控件的第一個(gè)位置。如果需要通過(guò)Invoke調(diào)用該方法,則使用Action委托和Invoke方法來(lái)執(zhí)行相同的操作。*///寫(xiě)入日志委托方法private void AddLog(int info, string Log){if (!lstInfo.InvokeRequired){//創(chuàng)建ListViewItem ,將時(shí)間與info放進(jìn)去ListViewItem lst = new ListViewItem(" " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), info);lst.SubItems.Add(Log);lstInfo.Items.Insert(0, lst);}else{Invoke(new Action(() =>{ ListViewItem lst = new ListViewItem(" " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), info);lst.SubItems.Add(Log);lstInfo.Items.Insert(0, lst);}));}}
初始化作綁定:
myaddlog=this.AddLog;//綁定方法
在連接PLC按鍵函數(shù)處調(diào)用一下這個(gè)方法:
//連接/斷開(kāi)PLCprivate void btn_Connect_Click(object sender, EventArgs e){//連接PLCif (button1_Clickf == true){btn_Connect.Text = "斷開(kāi)PLC";btn_Connect.BackColor = Color.Red;button1_Clickf = false;myaddlog(isconnected ? 1 : 0, isconnected ? "PLC連接成功" : "連接PLC失敗");}//斷開(kāi)PLC else if (button1_Clickf == false){btn_Connect.Text = "連接PLC";btn_Connect.BackColor = SystemColors.ActiveCaption;button1_Clickf = true;}}
? myaddlog(isconnected ? 0 : 1, isconnected ? "PLC連接成功" : "連接PLC失敗");?
? 中1和0表示的對(duì)應(yīng)引用哪個(gè)圖標(biāo):
?效果展示:
?
日志顯示不完整問(wèn)題解決:
?這里我們還是在之前的按鍵事件中,先寫(xiě)一個(gè)函數(shù)日志,是關(guān)于提示PLC已經(jīng)斷開(kāi)連接的,我們將其故意寫(xiě)得長(zhǎng)一些:
?
?發(fā)現(xiàn)運(yùn)行時(shí)后面的內(nèi)容無(wú)法正常顯示了:
這時(shí)就要在初始化Form時(shí)初始化lstInfo的屬性了,
設(shè)置第一列的寬度=整個(gè)寬度 減去 第0頁(yè)寬度lstInfo.Columns[1].Width = lstInfo.ClientSize.Width - lstInfo.Columns[0].Width;
這樣初步改進(jìn)就能實(shí)現(xiàn)顯示更長(zhǎng)位數(shù)了:
?
winform常用圖標(biāo)庫(kù)下載:
https://download.csdn.net/download/qq_64257614/89109129
網(wǎng)上資料查閱網(wǎng)址貼出:
【W(wǎng)inform學(xué)習(xí)筆記(七)】Winform無(wú)邊框窗體拖動(dòng)功能_winform窗體拖動(dòng)-CSDN博客
?2020-12-07_窗體控件imagelist添加圖片-CSDN博客
WinForm中遇到Label要顯示的內(nèi)容太長(zhǎng),自動(dòng)換行_winform 相鄰兩個(gè)label當(dāng)一個(gè)label過(guò)大時(shí),另一個(gè)位置自動(dòng)調(diào)整-CSDN博客
?