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)
ThanksMike
I can't create a demo since I can't even make it fail myself.
What I need to know is why the error occurs during a Paint event rather than at the time I actually add the duplicate node.
Does this mean the node must be added in a Begin/EndUpdate block? (which maybe causes it to not check for duplicates until it resumes updating - and presumably painting)
If that is the case then I know where the error must be occuring since I only use a Begin/EndUpdate block in one location.That is the same location where I add a bunch of nodes without keys.
I have seen a number of entries in the forum where it states that all nodes in the Tree must have a unique key. However you have an Add() function without any parameters which I use to load multiple nodes that I do not even need to find by key. That seems to work fine ... but could that be what is causing the problem?
Do I need to generate a unique key for each node even if I never plan to use that key?(That seems to contradict what appears to work fine - but it might explain the problem.)
Hello ,
If you are able to isolate your issue in a small sample and also provide me the exactly steps which I should follow in order to duplicate this behavior on my machine, I will be glad to investigate this further for you. Without a required sample I only could make a guesses about the reason for this issue and my help will be less efficient.
I am writing for your feedback
That's the problem - I already do what you suggest.
I use Add(Key, Text) in most cases and the value it is complaining about is specified in the Text parameter - never the Key parameter.(Only one item is added at a time so I dont use BeginUpdate/EndUpdate here)
In another place I use Add() and then specify the Text - but not the Key - so the key defaults to something like 'Node34'.(This is the case that adds multiple nodes so I do use BeginUpdate/EndUpdate here)
In addition, when I use the Add(Key,Text) function it is already surrounded by a test to ensure that the key does not already exist. (as in your example)
That is why I'm asking if there is any way that it can get the 2 mixed up - or if there is some case in which it uses the Text as a Key if I do not specifically set a key.
One additional point - I only saw this problem one time on WindowsXP and that was back in the early development when I probably didn't check for the existance of the key first.My test engineer tells me it now happens frequently on Windows7 but he has never seen the problem on XP... so the same code seems to work differently on Win7. I know you have a different 'look' when I set it to Windows7 so do you do anything else differently?
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.