Page 1 of 2
Exception: Index was outside the bounds of the array
Posted: Thu May 15, 2008 4:46 pm
by 9794065
I can reproduce this by having a complex 2D chart that contains series made up of CustomPoints. It seems to occur when the chart is first rendering and the mouse is over the area where the chart is about to be drawn.
Looking at the source code for TeeChart.dll version 3.2.3016.15521, I find
Code: Select all
public override int Clicked(int x, int y)
{
if (chart != null) chart.graphics3D.Calculate2DPosition(ref x, ref y, StartZ);
int result = base.Clicked(x, y);
if ((result == -1) && (firstVisible > -1) && (lastVisible > -1))
for (int t = firstVisible; t <= lastVisible; t++)
if (ClickedPointer(t, CalcXPos(t), CalcYPos(t), x, y))
{
OnClickPointer(t, x, y);
return t;
}
return result;
}
The call to CalcXPos(t), where t =0 and lastVisible = 0;
I guess the thing that seems wrong here is why is a click event firing when I have not clicked on anything. It is clear by the call stack below that the series of method calls is initiated by a mouse over event. That appears to be a problem because it ends up calling a mouse click event that is not quite ready. I did verify that if I keep the mouse out of the area in which it is drawing, I do not get the exception.
Stack trace:
TeeChart.dll!Steema.TeeChart.Styles.ValueList.this[int].get(int index = 0) Line 515 + 0xd bytes C#
TeeChart.dll!Steema.TeeChart.Styles.Series.CalcXPos(int index = 0) Line 2792 + 0xe bytes C#
TeeChart.dll!Steema.TeeChart.Styles.CustomPoint.CalcXPos(int valueIndex = 0) Line 1329 + 0x9 bytes C#
TeeChart.dll!Steema.TeeChart.Styles.CustomPoint.Clicked(int x = 269, int y = 157) Line 1373 + 0x12 bytes C#
TeeChart.dll!Steema.TeeChart.Tools.MarksTip.FindClickedSeries(int x = 269, int y = 157, ref int index = -1) Line 157 + 0x33 bytes C#
> TeeChart.dll!Steema.TeeChart.Tools.MarksTip.MouseEvent(Steema.TeeChart.MouseEventKinds kind = Move, System.Windows.Forms.MouseEventArgs e = {X = 269 Y = 157 Button = None}, ref System.Windows.Forms.Cursor c = {[Cursor: Default]}) Line 203 + 0x25 bytes C#
TeeChart.dll!Steema.TeeChart.Chart.BroadcastMouseEvent(Steema.TeeChart.MouseEventKinds kind = Move, System.Windows.Forms.MouseEventArgs e = {X = 269 Y = 157 Button = None}, ref System.Windows.Forms.Cursor c = {[Cursor: Default]}) Line 1190 + 0x28 bytes C#
TeeChart.dll!Steema.TeeChart.Chart.BroadcastMouseEvent(Steema.TeeChart.MouseEventKinds kind = Move, System.Windows.Forms.MouseEventArgs e = {X = 269 Y = 157 Button = None}, System.Windows.Forms.Keys modKeys = None) Line 1174 + 0x12 bytes C#
TeeChart.dll!Steema.TeeChart.TChart.OnMouseMove(System.Windows.Forms.MouseEventArgs e = {X = 269 Y = 157 Button = None}) Line 1381 + 0x25 bytes C#
Found the root cause
Posted: Thu May 15, 2008 7:52 pm
by 8739068
Found that the problem is that I am adding MarksTip tool during initialization of the chart control. This causes a problem if the chart takes a significant amount of time to render. While rendering, if the user mouses over or clicks on the chart, it will consistently throw this exception. However, if I postpone the adding the MarksTip tool until the chart has rendered, I can't get the exception to occur.
2 possible ways to solve this bug, both should maybe implemented
1. Use the After Draw event and not add the MarksTip tool until this event fires or some other means to detect that the chart has completed rendering.
2. Put in some logic to double check the values before indexes are used. Look at the stack trace provided and determine the best place to put this check in. This would be a change to the TeeChart source. Might be good to put into place anyway. As an extra measure put a try/catch around accessing the Steema.TeeChart.Styles.ValuList.this.Get property.
The real fix
Posted: Thu May 15, 2008 9:36 pm
by 8739068
I think I have really fixed the issue. After implementing solution #1, I still would see exceptions because on certain instances I would have a Series with 0 points. Because how we are using the TeeChart control, we will have series's with 0 points, sometimes. So I modified the source.
Here is the change I made:
Code: Select all
In Steema.TeeChart.Tools.MarksTip
private Styles.Series FindClickedSeries(int x, int y, ref int index)
{
for (int i = chart.Series.Count - 1; i >= 0; i--)
{
if (chart[i].Visible && chart.Series[i].Count > 0)
{
index = chart.Series[i].Clicked(x, y);
if (index != -1)
{
return chart.Series[i];
}
}
}
index = -1;
return null;
}
Noticed I added another condition to the if statement "&& chart.Series
.Count > 0"
This seemed to fix my issue.
Posted: Thu May 22, 2008 1:40 pm
by narcis
Hi Mike,
Thank you very much! It looks like a good fix to us. I've added it to the source code for the next maintenance release.
Posted: Fri Aug 08, 2008 1:33 pm
by 13046940
Hi I am using TeeChart v3.5.3105.20151 for .Net which is I believe the latest version available. I am getting a very similar error to the one discussed in this thread by using the NearestTool on a series that gets its datasource (datatable) emptied:
Index was outside the bounds of the array.
at Steema.TeeChart.Styles.ValueList.get_Item(Int32 index)
at Steema.TeeChart.Styles.Series.CalcXPos(Int32 index)
at Steema.TeeChart.Styles.CustomPoint.CalcXPos(Int32 valueIndex)
at Steema.TeeChart.Tools.NearestPoint.PaintHint()
at Steema.TeeChart.Tools.NearestPoint.ChartEvent(EventArgs e)
at Steema.TeeChart.Chart.BroadcastToolEvent(EventArgs e)
at Steema.TeeChart.Chart.InternalDraw(Graphics g, Boolean noTools)
at Steema.TeeChart.Chart.InternalDraw(Graphics g)
at Steema.TeeChart.TChart.Draw(Graphics g)
at Steema.TeeChart.TChart.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Is this a known issue or bug? Do you have an idea of what I can do to workaround the issue?
thanks!
Posted: Fri Aug 08, 2008 1:51 pm
by 13046940
Hi, me again. I have created a small sample that reproduces the issue easily. I have uploaded the file to your upload page (
http://www.steema.net/upload/Default.aspx).
The name of the file is NearestPointIssue.zip.
To reproduce the issue, do the following steps:
1- Drag your mouse over the chart so that the nearest point tool is used
2- Click on the button that I added at the top right corner of the chart to clear the poins in the line series.
You will see the exception right away.
Can you confirm that this is actually a bug and that it will be fixed in the next issue?
In the meantime, do you have a workaround for me?
Thanks!
Posted: Mon Aug 11, 2008 1:28 pm
by 13046940
Hi guys, could you please confirm that you have received the attachment I sent friday regarding this issue?
Thanks.
Posted: Mon Aug 11, 2008 3:04 pm
by Chris
Hello,
Sim wrote:Hi guys, could you please confirm that you have received the attachment I sent friday regarding this issue?
Yup, this defect has been entered into our bug-tracking software with reference TF02013322. It has already been fixed for the next maintenance release, due out in a few days.
A workaround could look like the following:
Code: Select all
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
line1.FillSampleValues(20);
tChart1.BeforeDraw += new Steema.TeeChart.PaintChartEventHandler(tChart1_BeforeDraw);
}
void tChart1_BeforeDraw(object sender, Steema.TeeChart.Drawing.Graphics3D g)
{
if (line1.Count > 0)
{
nearestPoint1.Series = line1;
}
else
{
nearestPoint1.Series = null;
}
}
private void button1_Click(object sender, EventArgs e)
{
line1.Clear();
}
Posted: Wed Aug 13, 2008 12:19 am
by 6923298
I've been having a similar problem, although it's very intermittent which makes pinpointing the cause very difficult for me.
However, the error message I received is:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at Steema.TeeChart.Styles.ValueList.get_Item(Int32 index)
at Steema.TeeChart.Functions.CrossPoints.LinesCross(Int32 index1, Int32 index2, Double& x, Double& y)
at Steema.TeeChart.Functions.CrossPoints.DoCalculation(Series source, ValueList notMandatorySource)
at Steema.TeeChart.Functions.CrossPoints.AddPoints(Array source)
at Steema.TeeChart.Styles.Series.AddValues(Array source)
at Steema.TeeChart.Styles.Series.FillFromDataSource()
at Steema.TeeChart.Styles.Series.CheckDataSource()
at Steema.TeeChart.Styles.Series.set_Function(Function value)
at Analyst.frmInterconnectorView.InterconnectorChartPlot(String interconnectorName, DateTime startDate, DateTime toDate)
Any suggestions on what I should do? Thanks.
Posted: Wed Aug 13, 2008 8:26 am
by Chris
Hello,
pw wrote:I've been having a similar problem, although it's very intermittent which makes pinpointing the cause very difficult for me.
Mmm, ok, I see what may be happening. Although I haven't been able to reproduce it, I've added the issue to our bug-tracking software with reference TF02013324 and a fix to it has been added to the next maintenance release, due out next month.
The only workaround I can think of would be to derive your own CrossPoints function and override DoCalculation, making it look like this:
Code: Select all
protected override void DoCalculation(Styles.Series source, ValueList notMandatorySource)
{
if (Series.DataSourceArray().Count>1)
{
source=(Series)(Series.DataSourceArray()[0]);
tmp1=ValueList(source);
tmpX1=notMandatorySource;
Series tmpS=(Series)(Series.DataSourceArray()[1]);
tmp2=ValueList(tmpS);
tmpX2=tmpS.notMandatory;
Series.Clear();
if ((tmpX1.Count>1) && (tmpX2.Count>1))
{
int index1=0;
int index2=0;
double x,y;
do
{
if (LinesCross(index1,index2,out x,out y))
Series.Add(x,y);
if (tmpX2.Value[index2+1]<tmpX1.Value[index1+1])
index2++;
else
index1++;
} while ((index1 < (tmpX1.Count - 1)) && (index2 < (tmpX2.Count - 1))); //TF02013324
}
}
}
Posted: Thu Aug 14, 2008 11:27 pm
by 6923298
Hi Christopher,
Can you please advise me on how I could apply the workaround in my code?
Code: Select all
Steema.TeeChart.Styles.Line flowDPLine = new Steema.TeeChart.Styles.Line(tChartInterconnector.Chart);
Steema.TeeChart.Styles.Line exportLimitDPLine = new Steema.TeeChart.Styles.Line(tChartInterconnector.Chart);
Steema.TeeChart.Styles.Line importLimitDPLine = new Steema.TeeChart.Styles.Line(tChartInterconnector.Chart);
Steema.TeeChart.Styles.Points exportPointDP = new Steema.TeeChart.Styles.Points(tChartInterconnector.Chart);
Steema.TeeChart.Styles.Points importPointDP = new Steema.TeeChart.Styles.Points(tChartInterconnector.Chart);
Steema.TeeChart.Functions.CrossPoints expCrossPointDP = new Steema.TeeChart.Functions.CrossPoints(tChartInterconnector.Chart);
Steema.TeeChart.Functions.CrossPoints impCrossPointDP = new Steema.TeeChart.Functions.CrossPoints(tChartInterconnector.Chart);
for (int i = 0; i < dpRow.Length; i++)
{
//code to fill data into flowDPLine, exportLimitDPLine and importLimitDPLine
}
exportPointDP.DataSource = new object[] { exportLimitDPLine, flowDPLine };
exportPointDP.Function = expCrossPointDP;
exportPointDP.CheckDataSource();
importPointDP.DataSource = new object[] { importLimitDPLine, flowDPLine };
importPointDP.Function = impCrossPointDP;
importPointDP.CheckDataSource();
Thanks.
Posted: Mon Aug 18, 2008 8:43 am
by Pep
Hello,
it cannot be applied directly to this part of code, in case you're a source code customer you can edit the Crosspoints.cs unit and update the code of the DoCalculation method for the one Chris attached on his post (it includes the fix). Another way would be to wait for next maintenance release which will be out in a month, or as he said, manually create a CrossPoints funcion which derive of the existing one and override the DoCalculation method.
Re: Exception: Index was outside the bounds of the array
Posted: Mon Jul 20, 2009 1:10 pm
by 13047896
Hello,
i have a similar problem. I'm using a wpf teechart control inside a usercontrol in an application with live data. The chart is placed in a WPF host inside a windows form application. An IndexOutOfRangeException occurs sporadically only when i'm using the markstip tool (MouseAction = Click). Many zooms and clicks where done correctly but in any cases the application crashes when i'm change the window.
I have already implemented the beforedraw event like in a post above, but it has no effect.
The full exception stacktrace is:
Code: Select all
Exception:System.IndexOutOfRangeException
TargetSite:
Double CalcXPos(Int32)
StackTrace(from Exception):
bei Steema.TeeChart.WPF.Styles.Series.CalcXPos(Int32 index)
bei Steema.TeeChart.WPF.Styles.CustomPoint.CalcXPos(Int32 valueIndex)
bei Steema.TeeChart.WPF.Styles.CustomPoint.Clicked(Double x, Double y)
bei Steema.TeeChart.WPF.Styles.Custom.Clicked(Double x, Double y)
bei Steema.TeeChart.WPF.Tools.MarksTip.MouseEvent(MouseEventKinds kind, MouseEventArgs e, Cursor& c)
bei Steema.TeeChart.WPF.Chart.BroadcastMouseEvent(MouseEventKinds kind, MouseEventArgs e, Cursor& c)
bei Steema.TeeChart.WPF.Chart.BroadcastMouseEvent(MouseEventKinds kind, MouseEventArgs e, ModifierKeys modKeys, Cursor& c)
bei Steema.TeeChart.WPF.Chart.DoMouseDown(Boolean IsDoubleClick, MouseEventArgs e, ModifierKeys Shift)
bei Steema.TeeChart.WPF.TChart.OnMouseDown(MouseButtonEventArgs e)
bei System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
bei System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
bei System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
bei System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
bei System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
bei System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
bei System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
bei System.Windows.Input.InputManager.ProcessStagingArea()
bei System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
bei System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
bei System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
bei System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
bei System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
bei System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
bei System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei HtMainApp.Program.Main()
Have you any idea ?
Thanks in advance
Re: Exception: Index was outside the bounds of the array
Posted: Mon Jul 20, 2009 3:13 pm
by narcis
Hi Lothar,
Can you attach a simple example project we can run "as-is" to reproduce the problem here and let us know the exact steps we should follow to reproduce it and the exact TeeChart version you are using?
Thanks in advance.
Re: Exception: Index was outside the bounds of the array
Posted: Tue Jul 21, 2009 5:50 am
by 13047896
I'm sorry the wpf control is inside a complex project. There is no way at the moment to exclude all of the functionality for the chart...the library with my own wrapper control for the chart is attached with this post. The chart usercontrol is called Chart.xaml. The version of teechart wpf control is 3.5.3470.15475.
Thanks