2

からいくつかの不安定な動作が発生していContextMenuStipます:

 private void lstModules_MouseMove(object sender , MouseEventArgs e)
 { mouse = e.Location; }
 private void lstModules_MouseDown(object sender , MouseEventArgs e)
 {
  ListViewItem item = null;
  if((hitTest = lstModules.HitTest(mouse)) != null)
   item = hitTest.Item;

  switch (e.Button)
  {
   case MouseButtons.Right:
    if (item != null)
    {
     // valid item selection
     ShowModuleDetails(item.Name);
     lstModules.ContextMenuStrip = mnuContext_Module;
    }
    else
    {
     // right-click - no item selection
     lblModuleDetails.Text = string.Empty;
     lstModules.ContextMenuStrip = mnuContext_Desktop;
    }

    lstModules.ContextMenuStrip.Show(lstModules , mouse);
    break;
   case MouseButtons.Left:
    if (item != null)
    { ShowModuleDetails(item.Name); }
    break;
  }
 }
 private void ShowModuleDetails(string modName)
 {
        //  get module details from dictionary
  lblModuleDetails.Text = Modules[modName].Details;
 }
  1. コンテキスト メニューが表示されている場合、リスト ビューの項目が正しく選択されません。つまり、項目が選択されると、詳細文字列値がラベル コントロールに表示されます。
  2. コンテキスト メニューが表示され、アイテムが選択されている場合、アイテムの詳細は変更されません。
  3. コンテキスト メニューの場所が、古いマウスの場所に一時的に表示された後、新しいマウスの場所に移動します。

コンテキスト メニューで間違っていることはありますか?

4

1 に答える 1

2

私はできる限りあなたの問題を再現しようとしました。挙げていただいた 3 つの問題のうち、少なくとも 2 つについてお手伝いできると思います。

1. リスト ビューのアイテムが常に適切に選択されているとは限りません。つまり、項目が選択されると、詳細文字列値がラベル コントロールに表示されます。

ListView.ItemSelectionChangedイベントを介してアイテムが選択されたときに通知を受けることができます。

//
// this handler's only responsibility is updating the item info label:
//
void lstModules_ItemSelectionChanged(object sender,
                                     ListViewItemSelectionChangedEventArgs e)
{
    if (e.IsSelected)
    {
        // an item has been selected; update the label, e.g.:
        lblModuleDetails.Text = e.Item.Text;
    }
    else
    {
        // some item has been de-selected; clear the label:
        lblModuleDetails.Text = string.Empty;
    }
}

3. コンテキスト メニューの場所が、古いマウスの場所に一時的に表示された後、新しいマウスの場所に移動します。

あなたはやりすぎだと思います。プロパティを介して指定したコンテキスト メニューの表示をフレームワークに処理させListView.ContextMenuStripます。発生する効果は、手動で を呼び出すことによって引き起こされますContextMenuStrip.Show(...)。その結果、フレームワークによってコンテキスト メニューが表示され、別の場所で同じことを 2 回実行します。

したがって、この関数を呼び出さないようにしてください。コンテキスト メニューは引き続き表示されます。

//
// this handler's only responsibility is setting the correct context menu:
//
void lstModules_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        var hitTest = lstModules.HitTest(e.Location);
        if (hitTest != null && hitTest.Item != null)
        {
            lstModules.ContextMenuStrip = mnuContext_Module;
        }
        else
        {
            lstModules.ContextMenuStrip = mnuContext_Desktop;
        }
    }
}

lstModules_MouseMoveところで、それが機能する場合は、イベント ハンドラーとmouse場所オブジェクトを取り除くこともできます。

于 2010-02-06T12:04:40.197 に答える