2012-10-13 164 views
11

有沒有可能在ListView中獲得雙擊行的值? 我註冊了一個事件:DoubleClick在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"); 

我想在messagebox中顯示雙擊行的「ID」。
如何做到這一點?如何從這個事件中獲得價值?

回答

16

試試這個:

private void lvLista_DoubleClick(object sender, EventArgs e) 
{ 

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

的(潛在的)問題,此代碼,會發生什麼,如果用戶點擊或雙擊列表中的空白區域?在某些情況下,他們可能希望最後選擇哪個項目作爲結果。然而,在其他情況下,除非用戶明確選擇用於雙擊的項目,否則他們可能不想要發生任何事情。 – XIVSolutions

+0

我發現我上面至少有一點不對。如果用戶雙擊空白區域,則DoubleClick事件不會觸發。對我很短視(我一直在使用一個不同的實現來設置一個用於其他方法的成員變量,所以有必要處理這種情況,即使用MouseDown事件沒有任何事情被點擊)。 – XIVSolutions

+0

當您雙擊某一行上的複選框時,此代碼有問題。 – confusedMind

20

如果處理MouseDown和/或ListView控件的MouseDoubleClick事件,並使用HitTest方法來確定鼠標動作的目標,你就會知道哪些項目已雙擊。這也是確定是否點擊NO項的一個好方法(例如,點擊部分填充列表中的空白區域

以下代碼將在文本框中顯示單擊的項目(如果發生單擊),並且如果發生雙擊,將彈出一個帶有雙擊項目名稱的消息框

如果單擊或雙擊發生在未由項目填充的列表視圖的區域中,則文本框或消息盒子通知yopu這個事實

這是一個微不足道的例子,根據你的需要,你將不得不一mess不振。

更新:我添加了一些代碼,當清單的空白區域被點擊或雙擊時清除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"; 
     } 
    } 
} 
1

謝謝;這是我需要的。我想我也想提一個可以建立本地信息變量更普遍爲:

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

試試這個

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

由於接受的答案並沒有幫助我,我以爲我會分享我對同樣問題的解決方案:在雙擊事件中從列表視圖中的特定列中獲取數據。

下面一行返回我雙擊了作爲一個字符串行中的第二列的數據:

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

我知道這個線程是舊的,但這裏沒有人在正確回答的問題我意見。對於那些在未來,試試這個,從MSDN

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