2017-08-14 42 views
0

I'm在飛行建設一個ContextMenu,這樣菜單項Click事件處理程序不叫

  readinstance = null; 
      ContextMenu cMenu = new ContextMenu(); 
      for (int i = 0; i < instances.Length; i++) { 
       string text = String.Format("{0} - {1}", instances[i].Id, instances[i].FormName); 
       MenuItem item = new MenuItem(text, new EventHandler(cMenuitem_Click)); 
       item.Tag = instances[i]; 
       cMenu.MenuItems.Add(item); 
      } 
      cMenu.Show((Button)sender, new Point(0, 0)); 
      cMenu.Dispose(); 
      if (readinstance == null) 
       throw new Exception("Must select some instance"); 

和處理程序

void cMenuitem_Click(object sender, EventArgs e) 
    { 
     MenuItem item = (MenuItem)sender; 
     readinstance = (FormPrintingStorage)item.Tag; 
    } 

菜單顯示正常,但是當我點擊了一些選項,處理程序不被調用,所以readinstance保持爲空,並且拋出異常。作爲一個側面說明,當我點擊任何選項時,菜單消失。 我看不出我的代碼有什麼問題。任何幫助將不勝感激。

回答

0

我正在回答我自己的問題,因爲我嘗試了更多的方法。 第一個是用ListView和一個「Ok」按鈕代替ContextMenu,因爲等待循環需要一個Thread.Sleep。沒意見。

解決方案是實現一個新的對話框,其中包含一個空列表視圖和一個Ok按鈕。一些相關的代碼如下。請注意,只有TreeViewItem/s在主窗體和對話框之間移動。

ListViewItem _result = null; 

    public ListViewItem Result { get { return _result; } } 

    public List<ListViewItem> Source 
    { 
     set 
     { 
      listView1.Items.Clear(); 
      foreach (ListViewItem item in value) 
       listView1.Items.Add(item); 
      listView1.View = View.List; 
     } 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     if (_result == null) 
      return; 
     DialogResult = DialogResult.OK; 
     Close(); 
    } 

    private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ListView list = (ListView)sender; 
     ListView.SelectedIndexCollection indices = list.SelectedIndices; 
     if (indices.Count == 0) 
      return; 
     _result = list.Items[indices[0]]; 

    } 

獲得結果,主窗體可以對標籤成員做任何事情。事實上,我在同一個表單中爲兩個不同的目的使用同一個對話框。