C# 双击ListView中的一行

C# 双击ListView中的一行,c#,.net,winforms,C#,.net,Winforms,是否有可能在ListView中获取双击行的值? 我注册了一项活动: private void lvLista_DoubleClick(object sender, EventArgs e) { MessageBox.Show(lvLista.SelectedItems.ToString()); } 但在消息中,当我双击listview中的某一行时,我得到: System.Windows.Forms.ListView+SelectedListViewIte

是否有可能在ListView中获取双击行的值? 我注册了一项活动:

    private void lvLista_DoubleClick(object sender, EventArgs e)
    {
        MessageBox.Show(lvLista.SelectedItems.ToString());
    }
但在消息中,当我双击listview中的某一行时,我得到:

System.Windows.Forms.ListView+SelectedListViewItemCollection

此外,我在listview中有两列:

    lvLista.Columns.Add("ID");
    lvLista.Columns.Add("Tilte");
我想在messagebox中显示双击行的“ID”
怎么做?如何从此事件中获取值?

尝试以下操作:

private void lvLista_DoubleClick(object sender, EventArgs e)
{

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

如果处理ListView控件的
MouseDown
和/或
MouseDoubleClick
事件,并使用
HitTest
方法确定鼠标操作的目标,您将知道双击了哪个项。这也是确定是否未单击任何项目的好方法(例如,单击部分填充列表中的空白区域)

如果单击一次,下面的代码将在文本框中显示单击的项目,如果双击,将弹出一个消息框,其中包含双击项目的名称

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

谢谢;这正是我所需要的。我想我还应该提到,可以更普遍地设置local info变量,如下所示:

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

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;

}

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

下一行以字符串形式返回我双击的行中第二列的数据:

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

我知道这条线索很古老,但我认为这里没有人正确回答这个问题。对于未来的人,请尝试以下方法:


(潜力)此代码的问题是,如果用户在列表的空白区域单击或双击,会发生什么情况?在某些情况下,他们可能希望最后选择的项目成为结果。但在其他情况下,他们可能不希望任何事情发生,除非用户显式选择一个项目进行双击。我发现我至少在上面有点错误。如果用户双击一个空白区域,DoubleClick事件不会触发。我太短视了(我一直在使用一个不同的实现,它设置了一个成员变量供其他方法使用,因此有必要处理使用MouseDown事件未单击任何内容的情况)。当您双击某一行上的复选框时,此代码出现问题。虽然此操作适用于双击,但如果两次完全不同的单击该项目,也会触发事件。我认为这是最好的解决方案
this.myListView.Activation = System.Windows.Forms.ItemActivation.TwoClick;
this.myListView.ItemActivate += new 
System.EventHandler(this.myListView_ItemClick);