Hi
I'm trying to understand some memory problems with my app and I need a basic understanding of how wingrid manages memory.
I have a button which executes a SQL query and returns a DataSet. The DataSet obviously owns an amount of memory
I then bind the DS to the grid using:
ultraGrid1.SetDataBinding( null, null ); ultraGrid1.SetDataBinding( oDS, null );
Q1: Does wingrid copy all of the data from the DataSet into the grid? Is my original DS unchanged?
Q2: If I press the button a 2nd time to repeat I will get a 2nd DataSet. Is my original DS still in memory? Does it go out of memory when ultraGrid1.SetDataBinding( null, null ); is called?
If I look at the app using Task Manager the memory just keeps going up until I get an out of memory exception
Thanks
Hello,
I am just checking about the progress of this issue. Have you been able to isolate the issue in a separate sample? Let me know if you need any further assistance on this issue.
Thank you for using Infragistics Components.
Hi,
Well, you should not have to do this. If the FilterUI is rooting column object in the previous grid when you attach it to a new grid, then something is wrong.
But if destroying the FilterUI and creating a new one helps, it seems like a viable workaround.
Hi Mike
A form-level variable means that in MainForm.cs I had:
private Infragistics.Win.SupportDialogs.FilterUIProvider.UltraGridFilterUIProvider ultraGridFilterUIProvider1;
Inside InitialiseComponents there was:
...
this.ultraGridFilterUIProvider1 = new Infragistics.Win.SupportDialogs.FilterUIProvider.UltraGridFilterUIProvider(this.components);
this.ultraGrid1.DisplayLayout.Override.FilterUIProvider = this.ultraGridFilterUIProvider1;
This code would have been put there when the form was first created several years ago.
As soon as I deleted that code and replaced it with the following inside the toolclick handler, the major problem went away:
Infragistics.Win.SupportDialogs.FilterUIProvider.UltraGridFilterUIProvider oColFilterUI; oColFilterUI = (Infragistics.Win.SupportDialogs.FilterUIProvider.UltraGridFilterUIProvider)ultraGrid1.DisplayLayout.Override.FilterUIProvider; if (null != oColFilterUI) { oColFilterUI.Dispose(); } ultraGrid1.DisplayLayout.Override.FilterUIProvider = null;
oColFilterUI = new Infragistics.Win.SupportDialogs.FilterUIProvider.UltraGridFilterUIProvider(); ultraGrid1.DisplayLayout.Override.FilterUIProvider = oColFilterUI;
The variable oColFilterUI is now method-level, rather than form-level.
A simple test harness of the first example shows that many UltraGidColumn objects are held in memory, whereas the 2nd does not.
One of my questions was "is it safe to call Dispose on oColFilterUI in the tool click as I am doing above?"
Now I can refresh the grid as many times as I like, but as soon as I type anything in a column filter the memory leak comes back. UltraGridColumn objects are being held in memory. I'm still trying to make a test harness to show that
I have a memory profiler, so that's no problem. If your sample demonstrates that the memory usage keep increasing or certain object references are increasing each time you perform the operation, we could duplicate that.
What do you mean by "the FuilterUIProvider is a form-level variable." As opposed to what? Are you placing the component on the form? Or are you creating it in such a way that it gets disposed along with the grid?
Thanks Mike
I'm trying to reproduce this in a test project. I can reproduce the problem with UltraGRidColumns being held in memory if the FuilterUIProvider is a form-level variable, but you need a memory profiler to see the results.
I can't reproduce the problem that I see whenever column filtering is used. My app is pretty consistent. By making the FilterUIProvider not a form-level object I can refresh the screen as many times as I like. As soon as I type "X" in a column filter I can only refresh it twice.
I will keep trying.