Hi,
"NodeMouseClick" in Ultra Tree View for getting the Context menu strip.
M.
mansi,
You can use the contextmenu property of the tree itself if all you want to do is show a context menu for a right click on a node. If you are using columns in the tree (e.g., OutlookExpress style), you can set up a context menu for the editor control assigned to the column.
As far as working with a nodemouseclick, in a Tree_MouseDown event handler you can use a hittest as in this code:
Dim hittestnode As UltraTreeNode = Me.MyTree.GetNodeFromPoint(Me.MyTree.PointToClient(Me.MousePosition)) If hittestnode Is Nothing Then Exit Sub
' Check for right click to get contextmenu If e.Button = MouseButtons.Right Then Exit Sub
' Get reference to cell under mouse position Dim cell As UltraTreeNodeCell = CellFromPoint(Me.MyTree, Me.MousePosition) If cell Is Nothing Then Exit Sub
Etc.
Hope this helps,
JC
I recommend using MouseUp rather than MouseDown. I think if you experiment with other applications you will find that context menus are always shown on MouseUp, not MouseDown. Using MouseDown can cause problems with mouse messages because the context menu eats the MouseUp and some controls will get confused when they get a MouseDown with no MouseUp.
Ok . but there is one problem about context menu and right click ..
when user do right click on node , node did not select .
user can select node only on left click :
how to select node with right click ?
tnx . Nenad
My setup is using a standard .Net context menu for the tree, not the form. Not sure why yours isn't working.
Have you checked some other settings, such as:
' Make the main tree fully editable by defaultMe.MyTree.ColumnSettings.AllowCellEdit = AllowCellEdit.FullMe.MyTree.Override.CellClickAction = CellClickAction.SelectNodeOnly
' Set Up Drag and DropMe.MyTree.Override.SelectionType = SelectType.SingleAutoDrag
I had to try different settings to get the behavior I wanted.
I am using Mouse down event for displaying the context menu strip on a tree node.I dont want the Context menu to appear on the + node.how can i avoid that?
Thanks,Mansi
/// <summary>/// Handles the UltraTree's MouseDown event./// </summary>private void UltraTree_MouseDown( object sender, MouseEventArgs e ){ if ( e.Button == MouseButtons.Right ) { UltraTree tree = sender as UltraTree; UIElement controlElement = tree != null ? tree.UIElement : null; UIElement elementAtPoint = controlElement != null ? controlElement.ElementFromPoint( e.Location ) : null; NodeSelectableAreaUIElement nodeElement = null;
while ( elementAtPoint != null ) { nodeElement = elementAtPoint as NodeSelectableAreaUIElement; if ( nodeElement != null ) break;
elementAtPoint = elementAtPoint.Parent; }
if ( nodeElement != null ) { // If you get in here, the right mouse button // was pressed on the node's selectable area, which does // not include the expansion indicator. } }}
After investigating Infragistic's code using Reflector I see that when context menu is opened via keyboard, it is shown at the center of the parent control and there is no way to override this behavior. So I've tried to do something similar to what UltraToolbarsManager.SetContextmenuUltra does but simplified. It works similar to Windows Explorer.
I've created a class inherited from UltaTree and added the following code:
private bool contextMenuShortcutPressed_;public MyTree(){ KeyDown += (sender, e) => { if (e.KeyCode == Keys.Apps || (e.KeyCode == Keys.F10 && e.Modifiers == Keys.Shift)) { contextMenuShortcutPressed_ = true; } };}public void SetContextMenu(PopupMenuTool popupMenuTool){ if (ContextMenu != null) { ContextMenu.Dispose(); } ContextMenu = new ContextMenu(); ContextMenu.Popup += (sender, e) => { Point screenPoint; if (contextMenuShortcutPressed_) { Point controlPoint; var activeNode = ActiveNode; if (activeNode != null) { var labelElement = activeNode.UIElement.GetDescendant(typeof(EditorWithTextUIElement)); var activeNodeRect = labelElement == null ? activeNode.UIElement.Rect : labelElement.Rect; controlPoint = new Point(activeNodeRect.X, activeNodeRect.Y + activeNodeRect.Height / 2); } else { var rect = UIElement.Rect; controlPoint = new Point((rect.Left + rect.Right) / 2, (rect.Top + rect.Bottom) / 2); } screenPoint = PointToScreen(controlPoint); } else { screenPoint = MousePosition; } contextMenuShortcutPressed_ = false; popupMenuTool.ShowPopup(screenPoint, Rectangle.Empty, DropDownPosition.BelowExclusionRect); };}
The ContextMenu class exposes a Show method, which takes the control and a location as relative to the control's coordinate system. I don't know of any event that fires when it is about to be displayed.
I have the same problem as malli_436. I want context menu to be shown near the active node when Shift+F10 or "Menu" keyboard key is pressed.
Is there any event like "before context menu open" where I can set the position of the context menu?
I am still unable to position my context menu generated through shortcut at the selected node or the selected cell/row itsel both in Ultra Tree and Ultra win grid.Please help me in finding the solution asap.
Thanks,
M
The Infragistics.Win.UIElement class encapsulates an object's user interface representation. The NodeSelectableAreaUIElement class derives from Infragistics.Win.UIElement; it represents the area of the node which when clicked will cause the node to become selected. This area includes the image and text, but not the expansion indicator.
The UltraTreeNode class exposes a UIElement property, which returns an object of type TreeNodeUIElement. This element represents the node's physical representation in the user interface. The UIElement class exposes a Rect property, which returns the bounds for the element, expressed in client coordinates. Note that the UltraTreeNode's UIElement property can under normal circumstances return null, which it does when the node is not in the viewable area of the control. When it returns a non-null value, you can convert the Location component of the Rect property to screen coordinates to determine the screen location of the node.