為了方便,我們經常會將一些功能做成小工具來做一些常用的檔案處理,但是 windows form 跟我們習慣寫的網頁即使元件很像,使用方式卻不太一樣,故將一些網頁表單常用的功能或技巧整理下來,避免開發上因為不熟悉造成進度緩慢的問題。
清空表單
程式碼如下:
private void ClearAllFields(Control.ControlCollection control){
foreach (Control childControl in control){
if (childControl is TextBox textBox){
textBox.Text = string.Empty;
}
else if (childControl is ComboBox comboBox){
comboBox.SelectedIndex = -1;
}
else if (childControl is CheckBox checkBox){
checkBox.Checked = false;
}
else if (childControl is RadioButton radioButton){
radioButton.Checked = false;
}
else if (childControl is NumericUpDown numericUpDown){
numericUpDown.Value = numericUpDown.Minimum;
}
else if (childControl is DateTimePicker dateTimePicker){
dateTimePicker.Value = DateTime.Now;
}
else if (childControl is CheckedListBox checkedListBox){
checkedListBox.Items.Clear();
}
}
}
網頁的form是有原生的reset()方法可以清空input值的,但 windows form 沒有,所以我們得要自己撰寫一個function來對表單常見的元件做清空,因為每種元件的清空方式不一樣所以需要各別處理,這段程式碼可以重置大部分我們常見的表單元件。
上傳檔案
windows form似乎是沒有寫好的上傳元件,所以我們只能透過按鈕觸發讀取檔案的動作,先附上整段的程式碼再來細部解說
private void button1_Click(object sender, EventArgs e){
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = “C:\\”;
openFileDialog.Filter = “(*.xml)|*.xml”;
openFileDialog.FilterIndex = 1;
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() == DialogResult.OK){
string selectedFilePath = openFileDialog.FileName;
fileNm = openFileDialog.FileName;
accessSetting = XmlHelper.DeserializeFromXml<AccessSetting>(fileNm);
var temp = accessSetting.Option.Select(o => o.Name);
foreach (var item in temp){
checkedListBox1.Items.Add(item);
}
}
}
是代表點擊button1按鈕時觸發的事件,在windows form內可以雙擊兩下設計界面自動建立這個事件的監聽器。
openFileDialog.InitialDirectory = “C:\\”;
代表指定開啟檔案的預設目錄,若是要預設成開啟檔案所在的目錄,則可以使用
openFileDialog.InitialDirectory = Environment.CurrentDirectory;
if (openFileDialog.ShowDialog() == DialogResult.OK)
代表讀取檔案成功時才執行後續的動作。
CheckedListBox的選項寫入與讀取
假設我們有一個叫做accessSetting 的 array儲存了每個選項的名稱(key)跟我們邏輯上要處理的值(value),我們需要將這個temp設為全域變數(不寫在事件function內),這樣才可以讓不同的事件讀取跟寫入選項。
我們可以用
foreach (var item in accessSetting){
checkedListBox1.Items.Add(accessSetting.Name);
}
的方式將選項加入checkedListBox
再用類似
foreach (var item in checkedListBox1.CheckedItems){
var temp= accessSetting.Option.FirstOrDefault(o => o.Name == item.ToString());
}
去剛剛讀取檔案時儲存的全域物件內提取我們所需要的value做處理。
結論
因為平常都是開發網頁功能居多,這次突然回來開發 windows form 有點邏輯轉換不過來,會覺得很多功能都應該有預設的function去處理,但仔細去爬了別人的文才發現這些都要自己做,也讓我體會到其實瀏覽器的設計跟框架真的默默的幫我們做掉了許多原本須要自己處理的事件跟邏輯,希望把常用到的功能一個一個記下來後以後在開發上可以更順暢,效率更高。