5

リストボックス内のアイテムをダブルクリックすると、何かをしようとしています。私はそれを行うためのこのコードを見つけました

void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        int index = this.listBox1.IndexFromPoint(e.Location);
        if (index != System.Windows.Forms.ListBox.NoMatches)
        {
            MessageBox.Show(index.ToString());
            //do your stuff here
        }
    }

ただし、アイテムをクリックしても、イベントは発生しません。すべてのアイテムの下にあるリストボックスをクリックすると、イベントが発生します。

のDataSourceプロパティをに設定しListBoxましたIList<MyObject>

何か案は?

4

5 に答える 5

5

MouseDownイベントとDoubleClickイベントを含むListBoxを使用してフォームを作成してみました。私が見る限り、DoubleClickが起動しない唯一の状況は、MouseDown内でMessageBox.Show(...)を呼び出すことです。それ以外の場合は正常に動作します。

そしてもう1つ、それが重要かどうかはわかりませんが、とにかく。もちろん、次のようにアイテムのインデックスを取得できます。

int index = this.listBox1.IndexFromPoint(e.Location);

しかし、この方法も問題ありません。

if (listBox1.SelectedItem != null)
    ...
于 2010-08-09T06:28:30.000 に答える
1

私にとってはうまくいくので、リスト内のアイテムに何かがあるか(カスタム?イベントを傍受する?)、またはイベントが適切に接続されていない可能性があると思います。

たとえば、これを試してください(Form1.csに記入してください)。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
   public class MyObject {
      public MyObject(string someValue) {
         SomeValue = someValue;
      }

      protected string SomeValue { get; set; }

      public override string ToString() {
         return SomeValue;
      }
   }


   public partial class Form1 : Form {
      public Form1() {
         InitializeComponent();

         var list = new List<MyObject> { 
            new MyObject("Item one"), new MyObject("Item two")
         };
         listBox1.DataSource = list;

      }

      private void listBox1_DoubleClick(object sender, EventArgs e) {
         Debug.WriteLine("DoubleClick event fired on ListBox");
      }
   }
}

これを含むデザイナーソースファイル(Form1.Designer.cs)を使用すると、次のようになります。

private void InitializeComponent() {
   this.listBox1 = new System.Windows.Forms.ListBox();
   ... // left out for brevity
   this.listBox1.DoubleClick += new System.EventHandler(this.listBox1_DoubleClick);

テストとして、テンプレートを使用して新しいフォームベースアプリケーションを作成し、リストボックスのみを追加してクラスMyObjectを定義します。同じ動作を観察するか、異なる動作を観察するかを確認します。

于 2010-08-08T12:24:30.037 に答える
1

すべての返信ありがとうございます。これで動作します。26071986が言ったように、e.Clicksが1かどうかをチェックして、MouseDownハンドラーでダブルクリックを処理することで解決しました。そうでない場合は、DoDragDropを呼び出し、そうでない場合は、ダブルクリックを処理するメソッドを呼び出します。

private void MouseDown_handler(object sender, MouseEventArgs e)
    {
        var listBox = (ListBox) sender;

        if (e.Clicks != 1)
        {
            DoubleClick_handler(listBox1.SelectedItem);
            return;
        }

        var pt = new Point(e.X, e.Y);
        int index = listBox.IndexFromPoint(pt);

        // Starts a drag-and-drop operation with that item.
        if (index >= 0)
        {
            var item = (listBox.Items[index] as MyObject).CommaDelimitedString();
            listBox.DoDragDrop(item, DragDropEffects.Copy | DragDropEffects.Move);
        }
    }
于 2010-08-09T10:03:05.477 に答える
1

これが私がMouseDoubleClickイベントで使用したものです。

    private void YourMethodForDoubleClick(object sender, MouseButtonEventArgs e)
    {
        Type sourceType = e.OriginalSource.GetType();
        if (sourceType != typeof(System.Windows.Controls.TextBlock)
            && sourceType != typeof(System.Windows.Controls.Border))
            return;

        //if you get here, it's one of the list items.

        DoStuff();
        ...
    }
于 2011-03-21T18:16:11.130 に答える
0

ジョン:それならうまくいく。しかし、私はMouseDownイベントも処理しているため、イベントが発生しないことがわかりました。MouseDown処理を削除しようとしましたが、機能します。これらの両方のイベントをスムーズに処理する方法はありますか?そうでない場合は、MouseDownイベントをダブルクリックする他の方法を見つける必要があります。

于 2010-08-09T06:11:21.593 に答える