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和/或MouseDoubleClick事件,并使用该HitTest方法确定鼠标动作的目标,您将知道哪个项目被双击。这也是确定是否单击了 NO 项的好方法(例如,单击部分填充列表中的空白区域。

如果发生单击,以下代码将在文本框中显示单击的项目,如果发生双击,则会弹出一个带有双击项目名称的消息框。

如果单击或双击发生在列表视图中未填充项目的区域,则文本框或消息框会通知 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

由于接受的答案对我没有帮助,我想我会分享我对同一问题的解决方案:在双击事件中从列表视图中的特定列获取数据。

以下行将我双击的行中第二列的数据作为字符串返回:

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 回答