UltraGridの行をドラッグしてUltraTimelineViewにドロップし、予定を追加する方法をご紹介します。

まず、UltraGrid側ではSelectTypeRowプロパティをSingleに設定して単一行選択モードとし、CellClickActionプロパティをRowSelectに設定してセルクリック時の動作を行選択としておきます。

ultraGrid1.DisplayLayout.Override.SelectTypeRow = Infragistics.Win.UltraWinGrid.SelectType.Single;
ultraGrid1.DisplayLayout.Override.CellClickAction = CellClickAction.RowSelect;

UltraTimeLineViewではAllowDropプロパティをtrueとしてドロップ操作を有効とします。

ultraTimelineView1.AllowDrop = true;

UltraGridのSelectionDragイベントをハンドリングしてDoDragDrop()メソッドを実行し、UltraGridのドラッグを開始します。

private void ultraGrid1_SelectionDrag(object sender, CancelEventArgs e)
{
     // UltraGridのドラッグを開始する
     ultraGrid1.DoDragDrop(ultraGrid1.Selected.Rows, DragDropEffects.Copy | DragDropEffects.Move);
}

UltraTimeLineViewのDragEnterイベントではドラッグされているデータをみてe.EffectをCopyとします。

private void ultraTimelineView1_DragEnter(object sender, DragEventArgs e)
{
     if (e.Data.GetDataPresent(typeof(SelectedRowsCollection)))
     {
         e.Effect = DragDropEffects.Copy;
     }
     else
     {
         e.Effect = DragDropEffects.None;
     }
}

UltraTimeLineViewのDragDropイベントではドロップ位置から時間とオーナーを取得し、ドラッグされた行データからAppointmentインスタンスを作成して、UltraCalendarInfoのAppointmentsコレクションに追加します。

private void ultraTimelineView1_DragDrop(object sender, DragEventArgs e)
{
     //ドロップ位置の時間とオーナーを取得する
     Point point = ultraTimelineView1.PointToClient(new Point(e.X, e.Y));
     DateTime dt = (DateTime)ultraTimelineView1.DateTimeFromPoint(point);
     Owner owner = ultraTimelineView1.OwnerFromPoint(point);

     // 追加するAppointmentを作成する
     SelectedRowsCollection SelRows = (SelectedRowsCollection)e.Data.GetData(typeof(SelectedRowsCollection));
     Appointment app = new Appointment(dt, dt.AddHours((double)SelRows[0].Cells["Duration"].Value));
     app.Subject = SelRows[0].Cells["AppId"].Value.ToString();
     app.Owner = owner;

     // Appointmentを追加する
     ultraCalendarInfo1.Appointments.Add(app);
}

製品について

Ultimate UI for Windows Forms