Your Privacy Matters: We use our own and third-party cookies to improve your experience on our website. By continuing to use the website we understand that you accept their use. Cookie Policy
1745
Phantom node causes duplicates
posted

My app adds nodes in 2 ways.

In one case it specifies both a key and text.
In the other it specifies text only (null key)

Occasionally [for no obvious reason] the tree is replaced by a large red X and a message box says
     Item has already been added. Key in dictionary: "Teradata SQL"

This occurs in response to an event - not due to a call from within my code. (It seems to be a Paint event - see trace below)

The problem is that I have searched my entire source base (including resource files) and the only time the string "Teradata SQL" is used it is used for the TEXT property - not the KEY.

Could the Tree somehow get confused if I am adding the nodes within a BeginUpdate/EndUpdate block and specifying a null key? 

How can a paint event (which I have no handler for) cause it to attempt to add a node?

Is there any way to trap this error?
Maybe add a Paint handler that simply calls your paint handler from inside a catch block ... but I think it is too late by then.

Traceback:

System.ArgumentException: Item has already been added. Key in dictionary: 'Teradata SQL'  Key being added: 'Teradata SQL'
   at System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add)
   at System.Collections.Hashtable.Add(Object key, Object value)
   at Infragistics.Win.UltraWinTree.NodeClientAreaUIElement.CacheNodeElements(Hashtable table, UIElementsCollection oldElements, Int32 startIndex)
   at Infragistics.Win.UltraWinTree.NodeClientAreaUIElement.PositionChildElements()
   at Infragistics.Win.UIElement.VerifyChildElements(ControlUIElementBase controlElement, Boolean recursive)
   at Infragistics.Win.UIElement.VerifyChildElements(Boolean recursive)
   at Infragistics.Win.UIElement.VerifyChildElements()
   at Infragistics.Win.UltraWinTree.UltraTreeUIElement.PositionChildElements()
   at Infragistics.Win.UIElement.VerifyChildElements(ControlUIElementBase controlElement, Boolean recursive)
   at Infragistics.Win.UIElement.DrawHelper(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode, Boolean clipText, Boolean forceDrawAsFocused, Boolean preventAlphaBlendGraphics)
   at Infragistics.Win.ControlUIElementBase.Draw(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode, Size elementSize, Boolean preventAlphaBlendGraphics)
   at Infragistics.Win.ControlUIElementBase.Draw(Graphics graphics, Rectangle invalidRectangle, Boolean doubleBuffer, AlphaBlendMode alphaBlendMode)
   at Infragistics.Win.UltraControlBase.OnPaint(PaintEventArgs pe)
   at Infragistics.Win.UltraWinTree.UltraTree.OnPaint(PaintEventArgs pe)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Thanks
Mike

Parents
No Data
Reply
  • 48586
    posted

    Hello ,

     

    If you try to add a UltraTreeNode to UltraTree Nodes collection, and the key of this node already exist into the UltraTree Nodes collection, then you will get ArgumetException . If you use Add(string value) method then the new added node will have as a key the value which you were pas as parameter. I am not exactly sure why you get this red X and as you said this kind of issues happens with painting of the component, so I assume that you are adding your nodes in some background thread  and that is why the exeption is trough in the background thread and the result is in the main UI thread. My suggestion is to add your nodes in BeginUpdate()/EndUpdate() bloc and to check if there already exist a node with the same key. To do this you could use code like:

     

    if(ultraTree1.GetNodeByKey(key) == null)

                ultraTree1.Nodes.Add(key);

     

    Please let me know if you have any further questions.

Children