我正在尝试在使用C#编写的应用程序中将光标捕捉功能添加到我的图表(WinForms控件)中。这是一些代码:
void chart_CursorPositionChanging( object sender, CursorEventArgs e ) {
DateTime date = DateTime.FromOADate( e.NewPosition );
if ( date.Equals( currentSnappedValue ) )
return;
var closest = dt.Select()
.OrderBy(
dr => Math.Abs( ( (DateTime)dr[ "Time" ] - date )
.TotalDays ) )
.FirstOrDefault();
if ( closest == null )
return;
DateTime newSnappedValue = (DateTime)closest[ "Time" ];
if ( !currentSnappedValue.Equals( newSnappedValue ) ) {
currentSnappedValue = newSnappedValue;
//chart.ChartAreas[ 0 ].CursorX.Position =
currentSnappedValue.ToOADate();
chart.ChartAreas[ 0 ].CursorX.SetCursorPosition(
currentSnappedValue.ToOADate() );
Debug.Assert(
chart.ChartAreas[ 0 ].CursorX.Position == currentSnappedValue.ToOADate(),
"Not moved" );
SelectRow( currentSnappedValue ); // DataGridView row selection
}
}
图表数据来自DataTable(dt变量),它也绑定到DataGridView。上面的代码用于将光标捕捉到现有DataPoint并在DataGridView中选择相应的行。这个DGV部分没有问题,图表部分没有问题。在UI中,光标保持在我单击的位置,并且没有移动到我尝试使用Cursor.Position
属性或Cursor.SetCursorPosition()
方法设置的位置(第一个在已发布的代码中注释)。我已经检查过,如果我使用SetCursotPosition方法,则将Position属性更改为所需的值。你知道为什么这两个都没有以图形方式移动光标吗?我是否需要在Chart控件或Cursor本身中设置某种切换为true / false?
也许那是因为我正在使用CursorPositionChanging事件?但CursorPositionChanged根本不会激活(如果我不允许用户光标选择)所以我不得不使用那个:(