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
Hello Robin,
I am following up to ask whether or not if you have any additional questions with our UltraTree control? If so, please let us know so we can assist you further. Thank you and have a nice day.
Thank you for your feedback.
If I understand you correctly when the user updates a single cell you are sending updated information for this cell through services. Then you perform some server side calculations and return all tables trough the service again. Can you tell me do you really need to send back all tables? Does your scenario allows to get only the updated rows? This should speed up the process.
Regarding freezing is it only the tree that freeze or entire form is frozen? How long does it freeze? Does the tree start to respond again or it hangs at all? Depending on your scenario one possible reason for this freezing may be slow handling of the request you send to the server.
DataTable’s load method when called with LoadOption set to Upsert actually loads all new rows while retain the old ones. Is this your scenario? This will load again entire data set each time the user change the content of a cell. However I believe that if your scenario allows it, it is better to retrieve from the server only changed rows. Please let me know if this is possible in your application.
Waiting for your feedback.
When I replace this code
boundTable.Load(updatedTable.CreateDataReader(), LoadOption.Upsert);
by this code
foreach (DataRow row in updatedTable.Rows) { var values = (from value in row.ItemArray select value.ToString()).ToArray(); UpdateInsertManningGuideRow(boundTable, values); }
private void UpdateInsertManningGuideRow(DataTable tableToUpdate, string[] values)
{ if (tableToUpdate == null) throw new ArgumentNullException("tableToUpdate");
if (values == null) throw new ArgumentNullException("values");
var id = values[1];
if (!tableToUpdate.Rows.Contains(id)) tableToUpdate.Rows.Add(values); else { var row = tableToUpdate.Rows.Find(id); row.ItemArray = values; } }
It works for me! There is no freeze anymore.
Ok, I extend your project in the way we do updates of the data tables. Please have a look into ultraTree1_AfterCellExitEditMode. So if you change values and tab through the cells or click somewhere else after editing, you can see an error that is not catchable in my code. It is not really the same problem I described above with the "freeze" but goes in that direction.
So maybe I should update data table rows manually, not with the DataTable.Load method...
Find the project attached.
Hi Milko!
Thanks a lot for your answer!
1. We do the calculations at the service backend and request the changed data again or return it directly by the services. Then we update the data tables via DataTable.Load method with LoadOption.Upsert. Works fine now! But the new problem is, that after upserting the changed data into the data tables, the user cannot leave the current row where he changed a value (and therefore a cell was in edit mode). No other row is clickable, row selection does not change. No events are fired from the tree anymore. Looks like a freeze of the tree except in the last current row. Maybe DataTable.Load is not a good idea? Do you know this problem somehow?
2. Adding new rows via DataTable.Load works pretty good and VERY FAST! :)
I try to extend your demo to show the problem from point 1. It's easier than to send you our code. Hard to extract an example from it.
Cheers!