Winfrom動態新增MenuStrip選單,同時繫結反射事件,可擴充套件後期動態配置
阿新 • • 發佈:2020-08-13
需求背景:
最近需要把多個一級選單做二級選單的整合
實現思路:
如果你覺得屬性值設定選單比較慢或者更喜歡用盡可能少的程式碼來動態繫結選單,不妨看看下面的程式碼,或許能給你得到幫助,然後你可以把選單事件單獨寫到一個時間方法,通過反射自動反射統一呼叫
我這裡分離出來是做一個使用者控制元件載入到winfrom視窗
public void InitView(EventHandler eventhandler) { if (this.menu.Items.Count > 0) { thisView Code.menu.Items.Clear(); } MenuStrip ms = this.menu; //新增選單一 var fileItem = ms.Items.AddContextMenu("檔案"); fileItem.DropDownItems.AddContextMenu("tsddmiCreateMock", "新建模擬資料", eventhandler); fileItem.DropDownItems.AddContextMenu("-"); fileItem.DropDownItems.AddContextMenu("tsddmiOpenFile", "開啟檔案", eventhandler); fileItem.DropDownItems.AddContextMenu("-"); fileItem.DropDownItems.AddContextMenu("tsddmiOpenFile", "開啟檔案", eventhandler); fileItem.DropDownItems.AddContextMenu("-"); fileItem.DropDownItems.AddContextMenu("tsddmiSave", "儲存", eventhandler); fileItem.DropDownItems.AddContextMenu("-"); fileItem.DropDownItems.AddContextMenu("tsddmiSaveAs", "另存為", eventhandler); //新增選單二 var editItem = ms.Items.AddContextMenu("編輯"); editItem.DropDownItems.AddContextMenu("tsmiClearData", "清空資料", eventhandler); editItem.DropDownItems.AddContextMenu("-"); editItem.DropDownItems.AddContextMenu("tsmiMergeOtherFile", "合併入其他檔案", eventhandler); editItem.DropDownItems.AddContextMenu("-"); editItem.DropDownItems.AddContextMenu("tsmiMergeLonggongQAData", "合併入龍宮QA資料", eventhandler); editItem.DropDownItems.AddContextMenu("-"); editItem.DropDownItems.AddContextMenu("tsmiMergeLonggongProData", "合併入龍宮正式資料", eventhandler); //新增選單三 ms.Items.AddContextMenu("tsmiCompare", "比對", eventhandler); //新增選單四 ms.Items.AddContextMenu("tsmiReportGeneration", "生成報表", eventhandler); } public virtual void menuStrip_ItemClicked(object sender, EventArgs e) { var tsmi = sender as ToolStripMenuItem; String methodName = tsmi.Name + "_Click"; MethodInfo method = this.GetType().GetMethod(methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (method == null) { MessageBox.Show("找不到方法" + methodName, "發生錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { try { method.Invoke(this, null); } catch (Exception ex) { MessageBox.Show(ex.ToString(), tsmi.Text + "發生錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }