2017-08-14 67 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]]; 

    } 

获得结果,主窗体可以对标签成员做任何事情。事实上,我在同一个表单中为两个不同的目的使用同一个对话框。