DoubleClick в строке в ListView

Есть ли возможность получить значение doubleclicked row в 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" строки с двойным щелчком.
Как это сделать? Как получить значения из этого события?

Ответ 1

Попробуйте следующее:

private void lvLista_DoubleClick(object sender, EventArgs e)
{

    MessageBox.Show(lvLista.SelectedItems[0].SubItems[0].Text);
}

Ответ 2

Если вы обрабатываете события MouseDown и/или MouseDoubleClick элемента управления ListView и используете метод HitTest для определения цели действия мыши, вы узнаете, какой элемент дважды щелкнул. Это также хорошее средство для определения того, был ли нажат элемент NO (например, нажав на пустую область в частично заполненном списке.

Следующий код отобразит щелкнутый элемент в текстовом поле, если произойдет один клик, и появится сообщение с именем элемента с двойным щелчком, если происходит двойной щелчок.

Если щелчок или двойной щелчок происходит в области просмотра списка, не заполненной элементом, текстовое поле или поле сообщения информируют об этом факте.

Это тривиальный пример, и в зависимости от ваших потребностей вам придется немного поработать с ним.

UPDATE: я добавил код, который очищает свойство SelectedItems элемента управления Listview при нажатии или двойном щелчке пустой области списка.

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

Ответ 3

Спасибо; это то, что мне нужно. Я подумал, что я бы также упомянул, что можно настроить локальную информационную переменную более широко:

  ListViewHitTestInfo info = ((ListView)sender).HitTest(e.X, e.Y);

Ответ 4

Попробуйте это

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;

}

Ответ 5

Поскольку принятый ответ мне не помог, я подумал, что поделился бы моим решением той же проблемой: получение данных из определенного столбца в списке в событии двойного щелчка.

Следующая строка возвращает данные второго столбца в строке, которую я дважды нажал в качестве строки:

private void listViewOutput_DoubleClick(object sender, EventArgs e)
{
   string content = listViewOutput.Items[listViewOutput.SelectedIndices[0]].SubItems[1].Text
}

Ответ 6

Я знаю, что эта ветка устарела, но никто, на мой взгляд, не ответил на вопрос. Для тех, кто в будущем, попробуйте это, от MSDN:

this.myListView.Activation = System.Windows.Forms.ItemActivation.TwoClick;
this.myListView.ItemActivate += new 
System.EventHandler(this.myListView_ItemClick);