none
Method 是否可轉 Event ? RRS feed

  • 問題

  • 繼我的上一個問題:Create .dll 中的 form
    http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/431dbc25-f81d-44bd-8e20-65624aa7fbb8

    我的程式碼片段如下:
    用Assembly.LoadFile()載入 DLL:
    MyAssemblys[i] = Assembly.LoadFile(FileName);

    由於一個DLL是一個系統,因此我把系統的中文名稱寫在DLL專案的Properties頁面中的「Assembly Info」按鈕裡的Title裡。
    我用下面程式碼取得,並加入下拉式功能表:
    //把載入的dll加入下拉式功能表
    AssemblyTitleAttribute ata = (AssemblyTitleAttribute)Attribute.GetCustomAttribute(MyAssemblys[i], typeof(AssemblyTitleAttribute));
    ToolStripMenuItem AssemblyMenu = new ToolStripMenuItem(ata.Title);
    menuStrip.Items.Add(AssemblyMenu);

    然後把DLL裡的Form加入上面建立的功能表:
    //載入下拉式功能表
                                foreach (Type LoadType in MyAssemblys[i].GetTypes())
                                {
                                        if (LoadType.BaseType == typeof(Form))
                                        {

                                            Form fm = Activator.CreateInstance(LoadType) as Form;
                                            ToolStripMenuItem ClassFormMenu = new ToolStripMenuItem(fm.Text, null, new EventHandler(createFormToolStripMenuItem_Click));                                       
                                            ClassFormMenu.Tag = LoadType;
                                            AssemblyMenu.DropDownItems.Add(ClassFormMenu);
                                        }
                                }

    上面程式碼片段裡的 createFormToolStripMenuItem_Click 事件,其實是我另外隨便建立的一個功能表的Click事件,
    用意是我需要一個事件指給上面程式碼片段每個新建立的功能表,以供建立對應的表單。
    程式碼如下:
    private void createFormToolStripMenuItem_Click(object sender, EventArgs e)
            {
                if ((sender as ToolStripMenuItem).Tag != null)
                {
                    Type t = (Type)(sender as ToolStripMenuItem).Tag;
                    Form f;
                    f = Activator.CreateInstance(t) as Form;
                    f.MdiParent = this;
                    f.Show();
                    f.WindowState = FormWindowState.Maximized;
                }
            }

    到目前為止,程式可以正常運作,
    但 createFormToolStripMenuItem_Click 是我建了一個功能表後才能產生的事件,
    這樣在MDI的功能表裡就會多了這一個,感覺怪怪的,
    請問各位大大,
    我是否可以自已產生一個事件,有點像是在一個Mothod一樣,
    然後把這個事件指給每個需要的功能表?
    或是,用什麼方法把一個Method指給新建立的ToolStripMenuItem?
    我試過好像 Method 不能直接傳給 EventHandler ..
    感謝~
    2009年3月30日 上午 07:18

解答

  • 經你描述後
    怎摸看~我的答案都還是一樣
    怎摸看都是要把動態產生的選單跟事件繫到一起
    這跟你的createFormToolStripMenuItem_Click怎摸產生看起來也無啥關聯
    建立個多餘的選單按Click是你自己加的動作
    只要自己手動Key個參數一樣的函式
    用上面我Po的方法把事件繫上
    是可以不用多餘的選單那一步的
    • 已標示為解答 艾爾文 2009年3月31日 上午 02:03
    2009年3月31日 上午 01:20

所有回覆

  • Try It

    ToolStripMenuItem AssemblyMenu = new ToolStripMenuItem(ata.Title);
    AssemblyMenu.Click += new EventHandler(createFormToolStripMenuItem_Click);
    menuStrip.Items.Add(AssemblyMenu);
    2009年3月30日 上午 07:30
  • 我想是我沒說明清楚,所以讓蹂躪大大誤會我的意思了。
    因為createFormToolStripMenuItem_Click
    這個事件是我在主功能表menuStrip上建立一個例如叫"Mother"的ToolStripMenuItem,
    然後在"mother"之下再Create一個例如叫"createForm"的ToolStripMenuItem,
    然後再用滑鼠Click它後VS2005自動幫我產生的事件,
    因為這樣做,這個 "createForm" 實際上是多餘的功能表,
    我只是把 Create Form 的程式碼寫在這裡,好讓動態建立的 ToolStripMenuItem 的 Click 事件可以指到這裡。

    我想要的是把這個 "createForm" ToolStripMenuItem 刪掉,
    看看能不能寫一個 Method 或 procedure 去Create Form,
    然後另外寫一個事件可以去 Call 這個 Method,
    而事件可以assign給動態產生的ToolStripMenuItem的Click事件。

    不知道這個應該怎麼做呢?  感謝~
    2009年3月30日 上午 10:17
  • 經你描述後
    怎摸看~我的答案都還是一樣
    怎摸看都是要把動態產生的選單跟事件繫到一起
    這跟你的createFormToolStripMenuItem_Click怎摸產生看起來也無啥關聯
    建立個多餘的選單按Click是你自己加的動作
    只要自己手動Key個參數一樣的函式
    用上面我Po的方法把事件繫上
    是可以不用多餘的選單那一步的
    • 已標示為解答 艾爾文 2009年3月31日 上午 02:03
    2009年3月31日 上午 01:20
  • 哎呀呀.. 原來是參數的問題呀!
    我以前就曾想過用一個函式做就好了,
    但以前試的時候不行,所以才會以為非得用個事件不可。
    原來只要函數的參數一樣就行了。
    非常感謝蹂躪大大的指導~~
    程式可以 Run 囉~
    2009年3月31日 上午 02:02