2017-08-14 6 views
0

- 私はこののMenuItemは

  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"); 

のように、その場でのContextMenuを構築し、ハンドラが

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

メニューが正しく表示されるが、私はいくつかのをクリックしたときであると呼ばれていないイベントハンドラをクリックしますオプション、ハンドラは呼び出されないので、readinstanceはnullのままで、例外はスローされます。注釈として、いずれかのオプションをクリックすると、メニューは消えます。 私のコードに何が問題なのか分かりません。どんな助けもありがとう。

答えて

0

私はより多くの方法を試したので、私自身の質問に答えています。 最初のものは、待ちループがThread.Sleepを必要としたため、ContextMenuをListViewと "Ok"ボタンで置き換えることでした。コメントはありません。

解決策は、空のリストビューと[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]]; 

    } 

結果を取得すると、メインフォームはタグメンバーで必要なことを行うことがあります。実際、同じダイアログを2つの異なる目的で同じ形式で使用しています。