C# - ListView:如何处理ListView项目上的鼠标单击事件?

3
假设我在表单上有一个ListView,其中填充了记录。我该如何做到:当我点击(单击)一行时,会发生某些事情 - 例如MessageBox.Show("row selected")?
如何实现这一点?我需要一个鼠标单击事件吗?我该如何做到这一点?

2
哪个ListView控件?WPF?Windows Forms? - undefined
5个回答

1
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    var selectedItemText = (listBox1.SelectedItem ?? "(none)").ToString();
    MessageBox.Show("Selected: " + selectedItemText);
}

private void listBox1_MouseClick(object sender, MouseEventArgs e)
{
    for (int i = 0; i < listBox1.Items.Count; i++)
    {
        var rectangle = listBox1.GetItemRectangle(i);
        if (rectangle.Contains(e.Location))
        {
            MessageBox.Show("Item " + i);
            return;
        }
    }

    MessageBox.Show("None");
}

但是我需要每当我点击一个项目时,这个事件发生。 - undefined
事实上,“SelectedIndexChanged”总是由鼠标点击调用的。如果你坚持使用“MouseClick”,你可以使用“GetItemRectangle”。 - undefined
正如@Barun所说,这个答案不是针对ListView的。没有GetItemRectangle()方法。 - undefined

1

@Tommy的回答是针对ListBox的,这个是针对ListView的:

    private void listView1_MouseClick(object sender, MouseEventArgs e)
    {
        for (int i = 0; i < listView1.Items.Count; i++)
        {
            var rectangle = listView1.GetItemRect(i);
            if (rectangle.Contains(e.Location))
            {
                //Write your code here
                return;
            }
        }
    }

0
为了防止ListView上的复选框出现意外行为,我的解决方案是:
private void lvMembers_MouseClick(object sender, MouseEventArgs e)
{
    for (int itemIndex = 0; itemIndex < lvMembers.Items.Count; itemIndex++)
    {
        ListViewItem item = lvMembers.Items[itemIndex];
        Rectangle itemRect = item.GetBounds(ItemBoundsPortion.Label);
        if (itemRect.Contains(e.Location))
        {
            item.Checked = !item.Checked;
            break;
        }
    }
}

0
如果你想在鼠标点击列表项时选择它,请尝试以下方法。
 private void timeTable_listView_MouseUp(object sender, MouseEventArgs e)
        {
            Point mousePos = timeTable_listView.PointToClient(Control.MousePosition);
            ListViewHitTestInfo hitTest = timeTable_listView.HitTest(mousePos);



            try
            {
            int columnIndex = hitTest.Item.SubItems.IndexOf(hitTest.SubItem);
            edit_textBox.Text = timeTable_listView.SelectedItems[0].SubItems[columnIndex].Text;
            }
            catch(Exception)
            {

            }



        }

0
其他的解决方案几乎都是正确的,但是每个人都忘记了一件事,你应该添加事件处理程序。
  private void listView1_Click(object sender, EventArgs e) {
  try {

     index = listView1.SelectedItems[0].SubItems[0].Text;

  } 
  catch {

  }
  /// Event handler
  this.listView1.Click += new System.EventHandler(this.listView1_Click);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接