2010-03-01 23 views
1

我有一個問題。C#,treeView,如何更改標準的右鍵單擊行爲

我在窗體上放了一個treeview控件並添加了一些節點。

public Form1() 
    { 
     InitializeComponent(); 

     treeView1.Nodes.Add("root node #1"); 
     treeView1.Nodes.Add("root node #2"); 
     treeView1.Nodes.Add("root node #3"); 
     treeView1.Nodes.Add("root node #4"); 
     treeView1.Nodes.Add("root node #5"); 
    } 

我想更改標準的右鍵單擊行爲。當我右鍵單擊樹節點時,樹視圖改變了一段時間selectedIndex。我不想要它。我如何解決標準行爲?

在理想的,這將是:右鍵點擊一個TreeNode文本 - >出現的上下文菜單中,右鍵點擊樹節點文本以外的任何地方 - >(絕對)沒有任何反應

+1

如果您需要澄清,請在答案下使用註釋。請保持話語公正。 –

回答

3
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
if (e.Button == MouseButtons.Right) 
{ 
    // put your logic here like 
    // ContextMenu1.Show(); 
} 
} 
+0

不,不,不,以上所有答案都不是我想知道的。我知道nodemouseclick事件。我問了treeview的標準行爲。爲什麼當我右擊它時treeview會改變selectedIndex? 我再次解釋一下,更仔細一點。對不起,我的英語不好。我希望你能打開我想要的東西。當我右鍵單擊節點附近的空間(位於節點右側的空間)時,treeview將selectedIndex改變了一段時間。它選擇一個節點一段時間(同時我保持鼠標右鍵按下)。我不想選擇一個對我無用的節點。我該如何解決它? –

0

覆蓋了鼠標點擊事件,在事件檢查,如果點擊了右鍵單擊

private void treeView1_MouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      //Do something 
     } 
    } 
+0

不,不,不,以上所有答案都不是我想知道的。我知道nodemouseclick事件。我問了treeview的標準行爲。爲什麼當我右擊它時treeview會改變selectedIndex? 我再次解釋一下,更仔細一點。對不起,我的英語不好。我希望你能打開我想要的東西。當我右鍵單擊節點附近的空間(位於節點右側的空間)時,treeview將selectedIndex改變了一段時間。它選擇一個節點一段時間(同時我保持鼠標右鍵按下)。我不想選擇一個對我無用的節點。我該如何解決它? –

0

您需要處理NodeMouseClick事件並檢查在鼠標右鍵被點擊:

treeView1.NodeMouseClick += (o, e) => { 
    if(e.Button == MouseButtons.Right) 
    { 
     //show menu... 
    } 
}; 
+0

不,不,不,以上所有答案都不是我想知道的。我知道nodemouseclick事件。我問了treeview的標準行爲。爲什麼當我右擊它時treeview會改變selectedIndex? 我再次解釋一下,更仔細一點。對不起,我的英語不好。我希望你能打開我想要的東西。當我右鍵單擊節點附近的空間(位於節點右側的空間)時,treeview將selectedIndex改變了一段時間。它選擇一個節點一段時間(同時我保持鼠標右鍵按下)。我不想選擇一個對我無用的節點。我該如何解決它? –

1

Alex, 試試這個。 BeforeSelect處理程序事件參數取消與鼠標右鍵關閉有關。這會抑制SelectedIndex發生更改。 MouseDown跟蹤鼠標右鍵是否被按下並顯示上下文菜單。顯示可以安全移動到MouseUp而不是MouseDown。 MouseUp清除指示RightMouse按鈕被按下的標誌。

有關我如何完成此操作的所有信息均可在MSDN上找到。訣竅實際上是讀取所有事件的名稱 - 是的,我知道有很多 - 然後在您命名SelectedIndex變化的情況下列出「有趣的」列表,並單擊鼠標。這會立即限制您應詳細閱讀的事件名稱......如果您希望文本在您正確點擊時不突出顯示,那麼這完全是另一回事,我警告您不要這樣做,因爲這是寶貴的用戶反饋。

bool isRBut = false; 
    private void treeView1_MouseDown(object sender, MouseEventArgs e) 
    { 
     isRBut = e.Button == MouseButtons.Right; 
     if (isRBut) 
     { 
      TreeViewHitTestInfo hti =treeView1.HitTest(e.Location); 
      if (hti.Location == TreeViewHitTestLocations.Label)     
       contextMenuStrip1.Show(treeView1, new Point(hti.Node.Bounds.Left, hti.Node.Bounds.Bottom));     
     } 
    } 

    private void treeView1_MouseUp(object sender, MouseEventArgs e) 
    { 
     isRBut = e.Button == MouseButtons.Right; 
    } 

    private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
    { 
     e.Cancel = isRBut; 
    } 

此外,這裏有一些人類語言瑣事爲你。希望這會在未來幫助你。諸如「不,不,」等短語被母語爲英語的人解釋爲非常粗魯。只要盡力列出你所看到的行爲,以及你想要的行爲。即使人們誤解只是堅持事實,並且沒有明顯的挫折跡象。這將幫助你獲得你想要的。同樣,如果某人有習慣不接受答案,這裏的許多成員都有習慣不向這些成員提供未來的答案。