19

ListViewでダブルクリックされた行の値を取得する可能性はありますか?イベントを登録しました:

    private void lvLista_DoubleClick(object sender, EventArgs e)
    {
        MessageBox.Show(lvLista.SelectedItems.ToString());
    }

しかし、メッセージでは、リストビューの行をダブルクリックすると、次のようになります。

System.Windows.Forms.ListView + SelectedListViewItemCollection

さらに、リストビューに2つの列があります。

    lvLista.Columns.Add("ID");
    lvLista.Columns.Add("Tilte");

そして、ダブルクリックした行の「ID」をメッセージボックスに表示したいと思います。
どうやってするの?このイベントから値を取得するにはどうすればよいですか?

4

6 に答える 6

29

ListViewコントロールのイベントMouseDownやイベントを処理し、このメソッドを使用してマウスアクションのターゲットを決定すると、どのアイテムがダブルクリックされたかがわかります。これは、アイテムがクリックされていないかどうかを判断するための良い手段でもあります(たとえば、部分的に塗りつぶされたリストの空の領域をクリックします。MouseDoubleClickHitTest

次のコードは、シングルクリックが発生した場合はクリックされたアイテムをテキストボックスに表示し、ダブルクリックが発生した場合はダブルクリックされたアイテムの名前を示すメッセージボックスをポップアップします。

アイテムが入力されていないリストビューの領域でクリックまたはダブルクリックが発生した場合、テキストボックスまたはメッセージボックスがyopuにその事実を通知します。

これは些細な例であり、ニーズに応じて、少し混乱させる必要があります。

更新:リストの空の領域がクリックまたはダブルクリックされたときに、ListviewコントロールのSelectedItemsプロパティをクリアするコードを追加しました。

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();

        listView1.MouseDown += new MouseEventHandler(listView1_MouseDown);
        listView1.MouseDoubleClick += new MouseEventHandler(listView1_MouseDoubleClick);
        this.Load += new EventHandler(Form1_Load);
    }


    void Form1_Load(object sender, EventArgs e)
    {
        this.SetupListview();
    }


    private void SetupListview()
    {
        ListView lv = this.listView1;
        lv.View = View.List;


        lv.Items.Add("John Lennon");
        lv.Items.Add("Paul McCartney");
        lv.Items.Add("George Harrison");
        lv.Items.Add("Richard Starkey");
    }


    void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ListViewHitTestInfo info = listView1.HitTest(e.X, e.Y);
        ListViewItem item = info.Item;

        if (item != null)
        {
            MessageBox.Show("The selected Item Name is: " + item.Text);
        }
        else
        {
            this.listView1.SelectedItems.Clear();
            MessageBox.Show("No Item is selected");
        }
    }



    void listView1_MouseDown(object sender, MouseEventArgs e)
    {
        ListViewHitTestInfo info = listView1.HitTest(e.X, e.Y);
        ListViewItem item = info.Item;

        if (item != null)
        {
            this.textBox1.Text = item.Text;
        }
        else
        {
            this.listView1.SelectedItems.Clear();
            this.textBox1.Text = "No Item is Selected";
        }
    }
}
于 2012-10-13T14:56:00.087 に答える
21

これを試して:

private void lvLista_DoubleClick(object sender, EventArgs e)
{

    MessageBox.Show(lvLista.SelectedItems[0].SubItems[0].Text);
}
于 2012-10-13T11:59:56.083 に答える
7

私はこのスレッドが古いことを知っていますが、私の意見では、ここの誰も質問に適切に答えませんでした。将来的には、MSDNからこれを試してください:

// User must double-click to activate item
myListView.Activation = System.Windows.Forms.ItemActivation.Standard;

// Add event handler
myListView.ItemActivate += new 
System.EventHandler(this.myListView_ItemClick);
于 2018-02-14T16:21:45.240 に答える
2

これを試して

private void listView1_MouseClick(object sender, MouseEventArgs e)
{
    ListViewHitTestInfo hit = listView1.HitTest(e.Location);

    Rectangle rowBounds = hit.SubItem.Bounds;
    Rectangle labelBounds = hit.Item.GetBounds(ItemBoundsPortion.Label);
    int leftMargin = labelBounds.Left - 1;

    string x = hit.Item.Text;

}
于 2015-05-26T07:40:18.260 に答える
2

受け入れられた答えは私を助けなかったので、私は同じ問題に対する私の解決策を共有すると思いました:ダブルクリックイベントのリストビューの特定の列からデータを取得します。

次の行は、ダブルクリックした行の2番目の列のデータを文字列として返します。

private void listViewOutput_DoubleClick(object sender, EventArgs e)
{
   string content = listViewOutput.Items[listViewOutput.SelectedIndices[0]].SubItems[1].Text
}
于 2016-01-19T09:59:21.543 に答える
1

ありがとう; これが私が必要としていたものです。ローカル情報変数をより一般的に次のように設定できることにも言及したいと思いました。

  ListViewHitTestInfo info = ((ListView)sender).HitTest(e.X, e.Y);
于 2014-07-30T12:44:42.633 に答える