2010-03-01 2 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"); 
    } 

Я хочу изменить стандартное поведение правой кнопкой мыши. Когда я щелкнул правой кнопкой мыши по дереву Node, Treeview изменил на некоторое время selectedIndex. Я не хочу этого. Как я могу исправить стандартное поведение?

В идеале это будет: щелкните правой кнопкой мыши по тексту treenode -> появится контекстное меню, щелкните правой кнопкой мыши в любом месте вне текста 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 выбраноIndex, когда я щелкнул его правой кнопкой мыши? Я объясню снова, более тщательно. Извините за мой плохой английский. Надеюсь, вы расстроены тем, что я хочу. Когда я щелкнул правой кнопкой мыши пробел рядом с узлом (пространство, расположенное справа от узла), treeview немного изменило значение selectedIndex. Он выбирает узел некоторое время (пока я держу нажатой правую кнопку мыши). Я не хочу выбирать узел, который для меня бесполезен. Как я могу это исправить? –

0

Override событие MouseClick, и в проверке событий, если щелчок был правой кнопкой мыши

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

Нет, нет, нет, все ответы выше не то, что я хочу знать. Я знаю о событии nodemouseclick. Я спросил о стандартном поведении дерева. Почему изменение treeview выбраноIndex, когда я щелкнул его правой кнопкой мыши? Я объясню снова, более тщательно. Извините за мой плохой английский. Надеюсь, вы расстроены тем, что я хочу.Когда я щелкнул правой кнопкой мыши пробел рядом с узлом (пространство, расположенное справа от узла), treeview немного изменило значение selectedIndex. Он выбирает узел некоторое время (пока я держу нажатой правую кнопку мыши). Я не хочу выбирать узел, который для меня бесполезен. Как я могу это исправить? –

0

Вам нужно обрабатывать событие NodeMouseClick и проверить правой кнопкой мыши была нажата:

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

Нет, нет, нет, все ответы выше не то, что я хочу знать. Я знаю о событии nodemouseclick. Я спросил о стандартном поведении дерева. Почему изменение treeview выбраноIndex, когда я щелкнул его правой кнопкой мыши? Я объясню снова, более тщательно. Извините за мой плохой английский. Надеюсь, вы расстроены тем, что я хочу. Когда я щелкнул правой кнопкой мыши пробел рядом с узлом (пространство, расположенное справа от узла), treeview немного изменило значение selectedIndex. Он выбирает узел некоторое время (пока я держу нажатой правую кнопку мыши). Я не хочу выбирать узел, который для меня бесполезен. Как я могу это исправить? –

1

Alex, Попробуйте это. Событие args BeforeSelect args Отмена привязана к тому, что правая мышь не работает. Это подавляет сжигание 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; 
    } 

Кроме того, для вас немного человеческих мелочей. Надеюсь, это поможет вам в будущем. Фразы, такие как «Нет, нет, нет», интерпретируются носителями английского языка как очень грубые. Просто приложите все усилия, чтобы перечислить поведение, которое вы видите, и поведение, которое вы хотите. Даже если люди неправильно понимают, придерживаются только фактов и не оставляют очевидных признаков расстройства. Это поможет вам получить то, что вам нужно. Также на SO, если у кого-то есть привычка не принимать ответы, многие члены здесь будут иметь привычку не предоставлять будущие ответы таким членам.

Смежные вопросы