Wired my first xamPivotGrid into a user control that is consumed by a winforms app. Borrowed a method from these forums that takes a DataTable and dynamically all columns and rows to an Ilist, which is set to the pivotDataSelector and pivotGrid's DataSource.
My application loads at a cost of 90,512k. I load the data into the pivot grid and it hit 96,180. The DataTable contains 1,216 rows and 8 columns. Dragging just 3 columns to the Rows box drives the application memory cost to ~1,650,227k before the application throws a System.OutOfMemory exception.
As my first venture, I am obviously missing something critical here, but not finding much and not really sure what to look for. Feeling additional paing because I am under the gun to get something working and performing by next Monday. I have seen code examples that set hierarchies and a whole bunch of other things that do not seem very appealing because of hard-coded column names, etc., and not even sure these would help me?
In short, I guess what I need is something like "Jaime, if your clients will be working with large (is my example above large???) data tables, then you need to do this..."
I will seriously cry if I can't get this to perform well. We purchased the IG Ultimate just for the pivot grid and time is running out for me... perhaps literally at that!
Many thanks!!! -Jaime
Hello Jaime,
Could you provide us at least your initialization code? Does your application perform well if you feed it using another items source? I mean you can try to create a dummy list populated with just few manually generated items and pass that list to FlatDataSource.ItemsSource. Also which version of the control you have?
Thanks.
PPilev.
Hello PPilev,
Using the latest 2011.2 controls. Here is the method in the user control to convert the DataTable to an Ilist for the data selector and pivot grid:
public void SetFlatDatasource(DataTable dt) { DynamicTypeBuilder typeBuilder = new DynamicTypeBuilder { DynamicAssemblyName = "MyAssembly", DynamicTypeName = "Pane" }; IList properties = new List(); foreach (DataColumn column in dt.Columns) { DynamicTypePropertyInfo propertyInfo = new DynamicTypePropertyInfo { PropertyName = column.ColumnName, PropertyType = column.DataType }; properties.Add(propertyInfo); } Type dynamicType = typeBuilder.GenerateType(properties); Type listType = typeof(List<>); Type genericListType = listType.MakeGenericType(dynamicType); IList list = (IList)Activator.CreateInstance(genericListType); foreach (DataRow dataRow in dt.Rows) { object myDynamicInstance = Activator.CreateInstance(dynamicType); foreach (DataColumn column in dt.Columns) { PropertyInfo propertyVal = dynamicType.GetProperty(column.ColumnName); if (dataRow[column] != DBNull.Value) { propertyVal.SetValue(myDynamicInstance, dataRow[column], null); } } list.Add(myDynamicInstance); } FlatDataSource flatDataSource = new FlatDataSource() { ItemsSource = list, Cube = DataSourceBase.GenerateInitialCube("Pane"), // if you know the names of demensions you want to be in rows and columns you can define them here Columns = DataSourceBase.GenerateInitialItems("[Columns]"), Rows = DataSourceBase.GenerateInitialItems("[Row]"), Measures = DataSourceBase.GenerateInitialItems("Value") }; dataSelector.DataSource = flatDataSource; pivotGrid.DataSource = flatDataSource; }
When you say initialization, do you mean the xaml? If yes, how can we post xaml in this forum? I will say it does not contain anything special. AllowCompactLayout is set to True, Height and Width are set to Auto...there is really nothing noteworthy.
Simple question, should this control perform well with a row count of say 2,000 with 8 columns?