ron.kagan Posted June 29, 2010 Report Share Posted June 29, 2010 Hello. I'm getting very frustrated with this control. I am working with a datatable that is crosstab transformed to a bar chart. in the databound event i am changing the x axis min and max, which caused the index was outside teh bounds of the array and this stacktrace : at ChartFX.WPF.SeriesDataArray.c(Int32 A_0) at ChartFX.WPF.DataArray.get_Item(Int32 series, Int32 point) at ChartFX.WPF.DataArray.ChartFX.WPF.Internal.IDataSimpleArray.get_Item(Int32 point) at ChartFX.WPF.GenericStepper.a(Double A_0, Double A_1) at ChartFX.WPF.NumericStepper.a(Double A_0, Double A_1, Double A_2, Double A_3, Boolean& A_4) at ChartFX.WPF.Axis.b(AxisPaint A_0, SectionAttributes& A_1, AxisPaintInfo& A_2, Double A_3, Double A_4, AxisPaintFlags A_5, Double A_6, Double A_7) at ChartFX.WPF.Axis.a(AxisPaint A_0, SectionAttributes& A_1, AxisPaintInfo& A_2, Double A_3, Double A_4, AxisPaintFlags A_5, Double A_6, Double A_7) at ChartFX.WPF.Axis.a(Size A_0, AxisPaintFlags A_1, FrameworkElement A_2, IPlotArea A_3, IAxisPainter A_4) at ChartFX.WPF.Axis.AxisPainter.OnRender(DrawingContext drawingContext) at System.Windows.UIElement.Arrange(Rect finalRect) at ChartFX.WPF.Controls.AxisPanel.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at ChartFX.WPF.Controls.SpacingDockPanel.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize) at System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds) at ActiproSoftware.Windows.Controls.Docking.DockingWindowContainer.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize) at System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds) at ActiproSoftware.Windows.Controls.Docking.HierarchyRootContainer.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize) at System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds) at ActiproSoftware.Windows.Controls.Docking.Workspace.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at ActiproSoftware.Windows.Controls.Docking.SplitContainer.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize) at System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Decorator.ArrangeOverride(Size arrangeSize) at System.Windows.Documents.AdornerDecorator.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds) at ActiproSoftware.Windows.Controls.Docking.HierarchyRootContainer.ArrangeOverride(Size finalSize) at ActiproSoftware.Windows.Controls.Docking.DockHost.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize) at System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize) at System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Decorator.ArrangeOverride(Size arrangeSize) at System.Windows.Documents.AdornerDecorator.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Control.ArrangeOverride(Size arrangeBounds) at ActiproSoftware.Windows.Controls.Docking.DockSite.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.DockPanel.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize) at System.Windows.Controls.ContentPresenter.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Grid.ArrangeOverride(Size arrangeSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Border.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Controls.Decorator.ArrangeOverride(Size arrangeSize) at System.Windows.Documents.AdornerDecorator.ArrangeOverride(Size finalSize) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.Window.ArrangeOverride(Size arrangeBounds) at ActiproSoftware.Windows.Controls.Ribbon.RibbonWindow.ArrangeOverride(Size arrangeBounds) at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect) at System.Windows.UIElement.Arrange(Rect finalRect) at System.Windows.ContextLayoutManager.UpdateLayout() at System.Windows.UIElement.UpdateLayout() at System.Windows.Interop.HwndSource.SetLayoutSize() at System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value) at System.Windows.Interop.HwndSource.set_RootVisual(Visual value) at System.Windows.Window.SetRootVisual() at System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight) at System.Windows.Window.CreateSourceWindowImpl() at System.Windows.Window.SafeCreateWindow() at System.Windows.Window.ShowHelper(Object booleanBox) at System.Windows.Window.Show() at System.Windows.Window.ShowDialog() at LogbiGUI.Boxes.ShowEBox(Exception e, String header, String additionalData, String relatedFile) at LogbiGUI.Boxes.ShowEBox(Exception e, String header, String additionalData, String relatedFile, String dllName) at LogbiUtils.Boxes.ShowEBox(Exception e, String header, String additionalData, String relatedFile) in E:\Visual Studio 2008 Projects\Logbi\LogbiUtils\Boxes.cs:line 101 at LogbiUtils.Boxes.ShowEBox(Exception e) in E:\Visual Studio 2008 Projects\Logbi\LogbiUtils\Boxes.cs:line 69 at Logbi.App.Current_DispatcherUnhandledException(Object sender, DispatcherUnhandledExceptionEventArgs e) in E:\Visual Studio 2008 Projects\Logbi\Logbi\App.xaml.cs:line 255 at System.Windows.Threading.Dispatcher.CatchException(Exception e) at System.Windows.Threading.Dispatcher.CatchExceptionStatic(Object source, Exception e) at System.Windows.Threading.ExceptionWrapper.CatchException(Object source, Exception e, Delegate catchHandler) at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) at System.Windows.Threading.DispatcherOperation.InvokeImpl() at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) at System.Threading.ExecutionContext.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Windows.Threading.DispatcherOperation.Invoke() at System.Windows.Threading.Dispatcher.ProcessQueue() at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) I cannot figure out what i am doing wrong as this sounds something you should be able to do. Quote Link to comment Share on other sites More sharing options...
JuanC Posted June 29, 2010 Report Share Posted June 29, 2010 Can you post some information about the structure of your data and how you are customizing the crosstab transform to help us duplicate this issue? JuanC Quote Link to comment Share on other sites More sharing options...
ron.kagan Posted June 29, 2010 Author Report Share Posted June 29, 2010 Sure thing. My data table consists of two columns - XValue (double) and YValue (int) here is the code I use chart1.Gallery = Gallery.Bar; chart1.ItemsSource = histogramTable.DefaultView; CrosstabTransform ctt = new CrosstabTransform(); ctt.RowPath = "XValue"; ctt.ValuePath = "YValue"; ctt.XValuePath = "XValue"; chart1.DataTransforms.Clear(); chart1.DataTransforms.Add(ctt); in the databound event , if this two lines exist, I get the mentioned exception : chart.AxisX.Min = new DataUnit(_minXValue); chart.AxisX.Max = new DataUnit(_maxXValue); If i skip these two lines , the chart appears but with no visible data as the axis is not correct. if i "refresh" - where i reassign the itemsource to the chart and the lines that sets the axixX min/max are called again, the chart appears as it should Quote Link to comment Share on other sites More sharing options...
JuanC Posted June 29, 2010 Report Share Posted June 29, 2010 I don't think you need a crosstab transform in this case, crosstab is not easy to explain in a few lines but I'll try. ChartFX normally uses columns in your dataset as series to be plotted (e.g. lines in a line chart) and records in your dataset as "points" in the X axis,e.g. Month - Nokia - RIM - Apple Jan - 14 - 12 - 9 Feb - 15 - 11 - 10 So you would create as many series as manufacturers and set their BindingPath properties appropriately, but sometimes your data looks like this Manufacturer - Month - Sales Nokia - Jan - 14 RIM - Jan - 12 Apple - Jan - 9 Nokia - Feb - 15 RIM - Feb - 11 Apple - Feb - 10 In this case you would probably want one series per manufacturer and one X point per month so you would use crosstab setting the RowPath as Month and ColumnPath as Manufacturer. Also note that bar charts normally do not support X values as it is not defined how wide should the bars be drawn. Normally XY data should be plotted using Scatter, Line or Area galleries. If you just want a scatter chart using this data you can create a SeriesAttributes, set its BindingPath and BindingPathX to the names of your Y and X fields and add this SeriesAttributes to the chart's series collection. The exception you are receiving is probably independent of this, if you know the min and max you want in a particular axis you don't have to wait for the bound event to set them. JuanC Quote Link to comment Share on other sites More sharing options...
ron.kagan Posted June 29, 2010 Author Report Share Posted June 29, 2010 Thanx. I now understand that crosstab was indeed overkill. the problem is there are still issues regarding the axis x as before: I use (as suggested) this code : SeriesAttributes se = new SeriesAttributes(); se.ItemsSource = histogramTable.DefaultView; se.BindingPath = "YValue"; se.BindingPathX = "XValue"; chart1.Series.Clear(); chart1.Series.Add(se); setting the min/max of the axisx still throw the same exception as before. Quote Link to comment Share on other sites More sharing options...
ron.kagan Posted June 29, 2010 Author Report Share Posted June 29, 2010 Let me add something - when i select from the gallery area/scatter, this works fine - the problem lies in the Bar type chart. i want to show bars with fixed width (the same as the step) so the outcome will look like continous steps : __ | |__ __| || | | || || | Quote Link to comment Share on other sites More sharing options...
JuanC Posted June 29, 2010 Report Share Posted June 29, 2010 We were able to duplicate the exception and it is in fact related to bar using XY data. Future builds will fix this exception by ignoring the X axis values for the bars. To get a chart similar to what you described you need the following code. chart1.Gallery = Gallery.Bar; ChartFX.WPF.Galleries.Bar barAttr = (ChartFX.WPF.Galleries.Bar) chart1.AllSeries.GalleryAttributes; barAttr.XValues = true; barAttr.XWidth = 0.2; Note that the XWidth property is set in the same units as your X axis, also note that overlapping is possible depending on your data. JuanC Quote Link to comment Share on other sites More sharing options...
ron.kagan Posted June 30, 2010 Author Report Share Posted June 30, 2010 thanx. I already figured the XValues = true and XWidth but what solved this was assigning the XValues = true before giving the series attributes the items source. I have another open question regarding mouse selection and zooming that was not answered for couple of days so if someone can have a look that will be nice. Quote Link to comment Share on other sites More sharing options...
JuanC Posted June 30, 2010 Report Share Posted June 30, 2010 Mouse selection issue should be fixed on build 3833. see original post for details. JuanC Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.