一、多窗體
1、哪個是主窗體
利用From1的button將From2打開
private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(); f2.Show(); this.Hide();//打開From2時,隱藏From1 }
光那樣出現的問題:主窗體隱藏了,關閉其它窗體后,沒有將主窗體顯示/關閉,那么程序就關不上了
(1)、構造函數傳值,將窗體傳到另一個窗體中去
首先打開From2代碼,並選擇事件FormClosing
Form1 F1 = null; public Form2(Form1 f1) { InitializeComponent(); F1 = f1; } private void Form2_FormClosing(object sender, FormClosingEventArgs e) { F1.Close(); }
然后將From1中的 Form2 f2 = new Form2();改為Form2 f2 = new Form2(this);
2、窗體只能打開一個
在From1中創建一個全局的泛型集合,為了放置全部打開的窗體
List<Form> flist = new List<Form>();
(1)、在窗體打開之前,判斷集合中是否有name一致的窗體,如果有就說明已經打開了,就不要再打開了
將From1中button1的點擊事件改為
bool has=false;//From2是否已被打開一次 Form2 f2 = new Form2(this); foreach(Form F in flist) { if(F.Name==f2.Name) { has = true; } } if (has) { } else { flist.Add(f2); f2.Show(); }
問題:當窗體打開了,關閉后,就無法再次打開了
辦法:當窗體關閉時,清除Form1中集合中的此窗體對象記錄
首先在from 1添加一個函數
public void deleteFrom(Form F) { flist.Remove(F); }
然后在From2的FormClosing事件中改為
if(F1!=null) { F1.deleteFrom(this); }
問題:當窗體已經打開,再次點擊打開按鈕,不會將已打開的窗體重新顯示並焦點進入
辦法:
找到已打開對象,將WindowState屬性設置為:
找到已打開窗體的對象,使用Focus方法;
在From1中button1的點擊事件中if(has){}中添加“ f2.Close();”,它起到釋放內存的作用
if(F.Name==f2.Name){has = true;}true;后添加F.WindowState = FormWindowState.Normal;//最小化或最大化時點擊按鈕恢復正常大小
F.Focus();//焦點進入
3、窗體之間的傳值和控制
傳值:構造函數傳值
將From2的構造函數改為
public Form2(Form1 f1,string uname)
{
InitializeComponent();
F1 = f1;
label1.Text = "歡迎回來," + uname;
}
在From1中改為 Form2 f2 = new Form2(this,textBox1.Text);
控制:第一步,找到窗體對象,第二步,將窗體對象的控件值更改
注意:要將窗體中的對象訪問權限修改為public:
在From2中添加新建一個按鈕和文本框,點擊此按鈕的點擊事件,添加if(F1!=null){F1.button1.Text=Textbox1.Text}
4、提示框類型的窗體
ShowDialog();
修改地方:
Form2 f2 = new Form2(this,textBox1.Text); f2.ShowDialog();
作用:
將窗體顯示為模式對話框。 在調用Form.ShowDialog方法后,直到關閉對話框后,才執行此方法后面的代碼
二、菜單和工具欄
1、MenuStrip:
頂部菜單,可右鍵點擊插入標准項
分割線:1、- 2、右鍵插入Separator
快捷鍵:每一個項右鍵屬性最下面ShortcuKeys可以設置快捷鍵,ShowShortcuKeys是否在該項上顯示快捷鍵
不管選項隱藏還是菜單隱藏,快捷鍵都管用
2、ContextMenuStrip:
右鍵菜單
在屬性 行為上ContextMeunStrip選擇您要關聯右鍵菜單,即可使用右鍵菜單,每一個控件都可以關聯右鍵菜單
3、StatusStript:
底部菜單
4、ToolStrip
工具條
5、ToolStripContainer
工具條容器