2012-10-13 29 views
11

Có khả năng nào để nhận giá trị của hàng được DoubleClick trong ListView không? Tôi đã đăng ký một sự kiện:DoubleClick trên một hàng trong ListView

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

Nhưng trên tin nhắn, khi tôi doubleclick một số dòng trong listview tôi nhận được:

System.Windows.Forms.ListView + SelectedListViewItemCollection

là gì hơn nữa, tôi có 2 cột trong listview:

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

Và tôi muốn hiển thị trong hộp thông báo "ID" của hàng được DoubleClick.
Cách thực hiện? Làm thế nào để có được một giá trị từ sự kiện này?

Trả lời

16

Hãy thử điều này:

private void lvLista_DoubleClick(object sender, EventArgs e) 
{ 

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

Vấn đề (tiềm năng) với mã này là gì sẽ xảy ra nếu người dùng nhấp hoặc nhấp đúp vào vùng trống trong danh sách? Trong một số trường hợp, họ có thể muốn bất kỳ mục nào được chọn lần cuối là kết quả. Tuy nhiên, trong các trường hợp khác, họ có thể không muốn điều gì xảy ra trừ khi người dùng chọn một mục rõ ràng cho nhấp đúp. – XIVSolutions

+0

Tôi thấy tôi đã có ít nhất một chút sai lầm ở trên. Nếu người dùng nhấp đúp vào một vùng trống, sự kiện DoubleClick sẽ không kích hoạt. Rất ngắn tầm nhìn của tôi (Tôi đã sử dụng một cài đặt khác để đặt biến thành viên để sử dụng bởi các phương thức khác, vì vậy cần phải xử lý trường hợp không có gì được nhấp bằng cách sử dụng Sự kiện MouseDown). – XIVSolutions

+0

Mã này có vấn đề khi bạn nhấp đúp vào hộp kiểm trên một hàng. – confusedMind

20

Nếu bạn xử lý các MouseDown và/hoặc MouseDoubleClick sự kiện của điều khiển ListView, và sử dụng phương pháp HitTest để xác định mục tiêu của hành động chuột, bạn sẽ biết được đồ vật bị nhấp đúp. Đây cũng là phương tiện tốt để xác định xem mục NO có được nhấp hay không (ví dụ: nhấp vào vùng trống trong danh sách được điền đầy đủ.

Đoạn mã sau sẽ hiển thị mục được nhấp trong hộp văn bản nếu một lần nhấp chuột xảy ra và sẽ bật lên một hộp thông báo với tên của mục được nhấp đúp nếu một nhấp đúp xảy ra.

Nếu nhấp chuột hoặc nhấp đúp xuất hiện trong khu vực chế độ xem danh sách không được điền bởi một mục, hộp văn bản hoặc thông báo hộp thông báo cho yopu về thực tế đó

Đây là một ví dụ nhỏ, và tùy theo nhu cầu của bạn, bạn sẽ phải gây rối với nó một chút.

CẬP NHẬT: Tôi đã thêm một số mã sẽ xóa thuộc tính SelectedItems của điều khiển Listview khi một vùng trống của danh sách được nhấp hoặc nhấp đúp.

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

Cảm ơn; đây là những gì tôi cần. Tôi nghĩ tôi cũng muốn đề cập đến người ta có thể thiết lập các biến thông tin địa phương nói chung như:

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

Hãy thử điều nà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; 

} 
1

Kể từ khi trả lời chấp nhận không giúp tôi tôi nghĩ rằng tôi sẽ chia sẻ giải pháp của tôi cho cùng một vấn đề: nhận dữ liệu từ một cột cụ thể trong một listview trong sự kiện nhấp đúp.

Các dòng sau trả về dữ liệu của cột thứ hai ở hàng mà tôi đã nhấp đúp vào như là một chuỗi:

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

Tôi biết chủ đề này là cũ nhưng không ai ở đây đã trả lời những câu hỏi đúng trong tôi ý kiến.Đối với những người trong tương lai, hãy thử điều này, từ MSDN:

this.myListView.Activation = System.Windows.Forms.ItemActivation.TwoClick; 
this.myListView.ItemActivate += new 
System.EventHandler(this.myListView_ItemClick); 
Các vấn đề liên quan