2011-01-27 8 views
3

私のC#WinFormsアプリケーションでは、ドラッグアンドドロップを使用してTreeViewコントロールからChartコントロールにアイテムを移動しています。 (それはジョブのリストを持つスケジューリングアプリであり、ユーザはそれらをスケジュールにドロップする)。ユーザーがグラフ上の既存のDataPointにアイテムをドロップすると、新しいアイテムをDataPointにして、古いアイテムを置き換えて(キュー内で移動させる)必要があります。WinForms Chart:DragDropイベント内でDataPointをどのように識別できますか?

は、ここで私はかなり(ただし、ほとんど)ないDragDropイベントハンドラのために持っているものの作業:

private void chart1_DragDrop(object sender, DragEventArgs e) 
{ 
    if (draggedJob != null) // This is set when user starts dragging 
    { 
     HitTestResult testResult = chart1.HitTest(e.X, e.Y, ChartElementType.DataPoint); 
     switch (testResult.ChartElementType) 
     { 
       case ChartElementType.DataPoint: 
        // This should happen if I dropped an item onto an existing DataPoint 
        // ...but testResult.ChartElementType is always "Nothing" 
        DataPoint existingPoint = (DataPoint)testResult.Object; 
        JobOrder jobToDisplace = (JobOrder)existingPoint.Tag; 

        ScheduleJob(draggedJob, jobToDisplace); 
        break; 
       default: 
        //This happens every time (it adds the item to the end of the schedule) 
        ScheduleJob(draggedJob); 
        break; 
     }           

     RefreshTreeView(); 
     RefreshChart();  

     draggedJob = null; 
    } 
} 

誰もが私の正気を保存し、私は、ユーザーがドロップされたDataPoint言うことができる方法を見つけ出す手伝ってくれる仕事に?

答えて

3

取得するマウスの位置(e.X、e.Y)は画面の座標になります。それをチャートコントロールにマップする必要があります。修正:

var pos = chart1.PointToClient(new Point(e.X, e.Y)); 
HitTestResult testResult = chart1.HitTest(pos.X, pos.Y, ChartElementType.DataPoint); 
+0

今すぐチャンピオンのようにドラッグアンドドロップしてください。ありがとう! –

関連する問題