Hi together,
we have some performance problems with the UltraWinTree. Populating data nodes collection takes extreme long. From 3 to 15 seconds, depending on the amount of data that is shown, of course.
To the application. It is a financial planning tool for employees manning guides. The image below shows a screenshot of application's tree and how we show that data to the user. As you can see, there are 4 levels of data. We show the positions that exists in a department. Employees can be attached to this positions. Then, every employee has a salary structure (structure is defined by the position and can very from position to position). So there are usually about 16-24 rows for salaries per employee (gray rows). Department sizes vary from 2 to 10 positions. Per Position there are about 5 employees. So we have about 10 * 5 * 24 = 1200 rows in really big departments. Smalls ones have about 200 rows.
Data is bound via data sets with tables and key constraints to the tree. We do all formattings per node in the InitializeDataNode event handler. Formatting takes about 200-300 ms. We can live with that. But populating the data nodes collection takes 3 to 15 seconds. With that, we can't live. To gain performance we set the SynchronizeCurrencyManager to false. We won about 200 ms.
Are there any other tricks to get more performance? Would be great if you can help here. Since the shown structure is the minimum structure we need in the application.
Thanks in advance!
Robin
Wow, that rocks! Great! Thanks a lot for the reply and demo project, Milko! Yes, must be something in our code, sure enough.
Yes, we do it a little bit different to your demo project. We do also format the columns in OnColumnSetGenerated. And our styles are a little bit more sophisticated. Then, we need to allow cell editing depending on various criteria (e.g. is the employee valid/active in a month and so on). At the last node level, we have to differentiate between different line types (for salaries that can be edited, for vacation that is calculated etc., all with different formatting). Then, we do the formatting directly on the existing Appearance objects. We do not define and reuse our own Appearance objects. Maybe this costs a lot performance? I will try that in our application.
In order to show you how we format the tree I like to send you our TreeFormatter class. We extract all the formatting logic to this class. It's not a running application as you suggested, but maybe you can see critical mistakes we do. The method SetupManningGuideDataNode is called in the InitializeDataNode event handler for each node. You can see what we do with each node in this method. Commenting out this code gives a boost of about 50-60% but populating data nodes costs still about 1-3 seconds.
We do no calculations depending on columns. All data including calculated data is coming from the server. We have the data tables in the data set and simple bind it to the control. But as mentioned above, we do formatting based on columns. Please see the attached TreeFormatter class again. There is the method SetupColumnSet that is called in the ColumnSetGenerated event handler.
I changed the references in your project back to 12.2. The version we use currently in the production version. Your application stays amazing fast with it. So I think there is no issue in the version we are using. Must be our code.
So I would really appreciate any hint or advice from your side. We are fighting with that problem at some customers which are really dissatisfied with OUR application. We really want to make it faster and I can not believe that this won't be possible with your controls. :)
Many many thanks for the demo and in advance to your answer!
Hello Robin,
Thank you for contacting Infragistics Support.
I followed the steps you suggested and was unable to reproduce the behavior you're describing. I have created a small sample solution with UltraTree with four level of nodes with approximately 5 – 6 thousand nodes. I have applied an appearance to each level in InitializeDataNode event handler. My UltraTree gets populated in less than a second.
Please let me know if you perform some other operations over the three nodes in your application. Are you apply stilling according to some other criteria than node level? If so what criteria are you using? Do you perform some calculations over the nodes before load them, e.g. summarize data, calculate data in some columns depending on other column and so on?
I have attached the sample project I used to test this. Please test this project on your PC; whether or not it works correctly may help indicate the nature of this issue.
If the project does not work correctly, this indicates either an issue possibly specific to your environment, or a difference in the DLL versions we are using. My test was performed using version 14.2.20142.2059 in Infragistics Controls 14 Volume 2. So could you please let me know the exact version of Infragistics components which you are using?
If the project does show the product feature working correctly, this indicates a possible issue in the code of your application. It will help if you can provide a small, isolated sample application that demonstrates the behavior you are seeing.
Or, if this sample project is not an accurate demonstration of what you're trying to do, please feel free to modify it and send it back.
Waiting for your feedback.