Hi all,
Is it possible to get drag & drop working using multiple resources because I can't find anything about this. I've got the drag and drop working just fine for the standard view (just one resource), but when I set the GroupType of the radscheduler to GroupType.Resource, it won't work.
An other questing:
How can I get multple resources on the same screen. I can only get 2 resources at my screen, and I need to use a scrollbar to get to the next resource, so is there a property I need to set somewhere?
Is it possible to get drag & drop working using multiple resources because I can't find anything about this. I've got the drag and drop working just fine for the standard view (just one resource), but when I set the GroupType of the radscheduler to GroupType.Resource, it won't work.
An other questing:
How can I get multple resources on the same screen. I can only get 2 resources at my screen, and I need to use a scrollbar to get to the next resource, so is there a property I need to set somewhere?
11 Answers, 1 is accepted
0
Richard Slade
Top achievements
Rank 2
answered on 07 Feb 2011, 02:18 PM
hello,
At this stage, I'm not sure about the drag and drop. I will have to try this. Can you provide an exmaple or what you are trying to do?
For the multiple resources part, please take a look at the documentation at this link.
Hope that helps
Richard
At this stage, I'm not sure about the drag and drop. I will have to try this. Can you provide an exmaple or what you are trying to do?
For the multiple resources part, please take a look at the documentation at this link.
Hope that helps
Richard
0
Gerben
Top achievements
Rank 1
answered on 07 Feb 2011, 03:09 PM
The solution for the showing multiple resources only works as long as you don't change the view.
for example I start at the day view, showing only 1 day for each resource. When i switch to week view, and then switch back, I'm seeing 3 days for every resource, and only 2 resources in the total view.
I used this code to set the dayview to 1 day and the amount of resources to 4:
I'm using the 2010.3.10.1215 build.
I've got the following Code: (sorry for the amount of code, but I can't add an archive to this topic)
Form1
Designer file
Meeting file
for example I start at the day view, showing only 1 day for each resource. When i switch to week view, and then switch back, I'm seeing 3 days for every resource, and only 2 resources in the total view.
I used this code to set the dayview to 1 day and the amount of resources to 4:
this
.radScheduler1.GetDayView().DayCount = 1;
this
.radScheduler1.GetDayView().ResourcesPerView = 4;
I'm using the 2010.3.10.1215 build.
I've got the following Code: (sorry for the amount of code, but I can't add an archive to this topic)
Form1
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
Telerik.WinControls;
using
Telerik.WinControls.UI;
namespace
RadSchedulerDummy
{
public
enum
AppointmentFields
{
Row,
Summary,
Location,
Description,
Start,
End,
Background,
Status
}
public
class
DragObject
{
private
AppointmentFields status;
private
Dictionary<AppointmentFields,
object
> values =
new
Dictionary<AppointmentFields,
object
>();
public
AppointmentFields Status
{
get
{
return
this
.status;
}
set
{
this
.status = value;
}
}
public
Dictionary<AppointmentFields,
object
> Values
{
get
{
return
this
.values;
}
}
}
public
partial
class
RadForm1 : Telerik.WinControls.UI.RadForm
{
private
List<Meeting> meetings =
new
List<Meeting>();
public
RadForm1()
{
InitializeComponent();
Resource r1 =
new
Resource();
r1.Name =
"Office 1"
;
r1.Color = Color.Blue;
Resource r2 =
new
Resource();
r2.Name =
"Office 2"
;
r2.Color = Color.Red;
Resource r3 =
new
Resource();
r3.Name =
"Office 3"
;
r3.Color = Color.Gray;
Resource r4 =
new
Resource();
r4.Name =
"Office 4"
;
r4.Color = Color.Yellow;
this
.radScheduler1.Resources.Add(r1);
this
.radScheduler1.Resources.Add(r2);
this
.radScheduler1.Resources.Add(r3);
this
.radScheduler1.Resources.Add(r4);
this.radScheduler1.GroupType = GroupType.Resource;
this
.radScheduler1.AllowDrop =
true
;
this
.radScheduler1.DragEnter +=
new
DragEventHandler(radScheduler1_DragEnter);
this
.radScheduler1.DragDrop +=
new
DragEventHandler(radScheduler1_DragDrop);
this
.radScheduler1.GetDayView().DayCount = 1;
this
.radScheduler1.GetDayView().ResourcesPerView = 4;
this
.FillGrid();
this
.radGridView1.DataSource =
this
.meetings;
this
.radGridView1.GridBehavior =
new
MyGridBehavior();
}
void
radScheduler1_DragDrop(
object
sender, DragEventArgs e)
{
Point point =
this
.radScheduler1.PointToClient(
new
Point(e.X, e.Y));
DayViewAppointmentsTable table = (
this
.radScheduler1.SchedulerElement.ViewElement
as
SchedulerDayViewElement).DataAreaElement.Table;
SchedulerCellElement schedulerCell = SchedulerUIHelper.GetCellAtPoint(point, table.Children);
DragObject dragObject = e.Data.GetData(
typeof
(DragObject))
as
DragObject;
if
(dragObject !=
null
)
{
this
.radScheduler1.Appointments.BeginUpdate();
Appointment appointment = CreateAppointment(schedulerCell.Date, dragObject);
this
.radScheduler1.Appointments.Add(appointment);
this
.radScheduler1.Appointments.EndUpdate();
this
.radGridView1.Rows.RemoveAt(
this
.radGridView1.SelectedRows[0].Index);
}
}
void
radScheduler1_DragEnter(
object
sender, DragEventArgs e)
{
DragObject dragObject = e.Data.GetData(
typeof
(DragObject))
as
DragObject;
e.Effect = dragObject ==
null
? DragDropEffects.None : DragDropEffects.Copy;
}
public
Appointment CreateAppointment(DateTime currentDate, DragObject dragObject)
{
Appointment appointment =
new
Appointment();
DateTime startDate = currentDate;
DateTime endDate = currentDate.AddHours(1);
switch
(dragObject.Status)
{
case
AppointmentFields.Summary:
appointment.Summary = dragObject.Values[dragObject.Status]
as
string
;
break
;
case
AppointmentFields.Row:
appointment.Summary = dragObject.Values[AppointmentFields.Summary]
as
string
;
appointment.Description = dragObject.Values[AppointmentFields.Description]
as
string
;
appointment.BackgroundId = (
int
)dragObject.Values[AppointmentFields.Background];
appointment.StatusId = (
int
)dragObject.Values[AppointmentFields.Status];
appointment.Location = dragObject.Values[AppointmentFields.Location]
as
string
;
startDate = (DateTime)dragObject.Values[AppointmentFields.Start];
endDate = (DateTime)dragObject.Values[AppointmentFields.End];
TimeSpan range = endDate - startDate;
endDate = currentDate + range;
startDate = currentDate;
break
;
}
appointment.Start = startDate;
appointment.End = endDate;
return
appointment;
}
private
void
FillGrid()
{
for
(
int
i = 1; i < 20; i++)
{
this
.meetings.Add(
new
Meeting(i,
"Meeting "
+ i, 1, 3));
}
}
private
class
MyGridBehavior : BaseGridBehavior
{
private
Point mouseDownPoint = Point.Empty;
public
override
bool
OnMouseDown(MouseEventArgs e)
{
if
(e.Button == MouseButtons.Left)
{
mouseDownPoint = e.Location;
}
return
base
.OnMouseDown(e);
}
public
override
bool
OnMouseMove(MouseEventArgs e)
{
if
(e.Button != MouseButtons.Left)
{
this
.mouseDownPoint = Point.Empty;
return
base
.OnMouseMove(e);
}
if
(!
this
.GridViewElement.IsInEditMode &&
this
.ShouldBeginDrag(
this
.mouseDownPoint, e.Location))
{
RadElement element =
this
.GridControl.ElementTree.GetElementAtPoint(e.Location);
GridCellElement cell = element
as
GridCellElement;
if
(cell !=
null
&& cell ==
this
.GridViewElement.CurrentCell)
{
DragObject dragObject =
new
DragObject();
dragObject.Values.Add(AppointmentFields.Summary,
"Meeting: "
+ cell.RowInfo.Cells[
"ID"
].Value);
dragObject.Values.Add(AppointmentFields.Start, DateTime.Now);
dragObject.Values.Add(AppointmentFields.End, DateTime.Now.AddHours(1));
dragObject.Values.Add(AppointmentFields.Description,
"Meeting"
);
dragObject.Values.Add(AppointmentFields.Background, 1);
dragObject.Values.Add(AppointmentFields.Status, 1);
dragObject.Values.Add(AppointmentFields.Location,
"Office"
);
dragObject.Status = AppointmentFields.Row;
this
.GridViewElement.ElementTree.Control.DoDragDrop(dragObject, DragDropEffects.Copy);
return
true
;
}
}
return
base
.OnMouseMove(e);
}
private
bool
ShouldBeginDrag(Point current, Point capture)
{
Size dragSize = SystemInformation.DragSize;
Rectangle dragRect =
new
Rectangle(capture.X - dragSize.Width / 2,
capture.Y - dragSize.Height / 2,
dragSize.Width, dragSize.Height);
return
!dragRect.Contains(current);
}
}
}
}
Designer file
partial
class
RadForm1
{
/// <summary>
/// Required designer variable.
/// </summary>
private
System.ComponentModel.IContainer components =
null
;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected
override
void
Dispose(
bool
disposing)
{
if
(disposing && (components !=
null
))
{
components.Dispose();
}
base
.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private
void
InitializeComponent()
{
Telerik.WinControls.UI.DateTimeInterval dateTimeInterval1 =
new
Telerik.WinControls.UI.DateTimeInterval();
this
.radGridView1 =
new
Telerik.WinControls.UI.RadGridView();
this
.radSchedulerNavigator1 =
new
Telerik.WinControls.UI.RadSchedulerNavigator();
this
.radScheduler1 =
new
Telerik.WinControls.UI.RadScheduler();
((System.ComponentModel.ISupportInitialize)(
this
.radGridView1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(
this
.radGridView1.MasterTemplate)).BeginInit();
((System.ComponentModel.ISupportInitialize)(
this
.radSchedulerNavigator1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(
this
.radScheduler1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(
this
)).BeginInit();
this
.SuspendLayout();
//
// radGridView1
//
this
.radGridView1.Dock = System.Windows.Forms.DockStyle.Bottom;
this
.radGridView1.Location =
new
System.Drawing.Point(0, 418);
this
.radGridView1.Name =
"radGridView1"
;
this
.radGridView1.Size =
new
System.Drawing.Size(1242, 150);
this
.radGridView1.TabIndex = 0;
this
.radGridView1.Text =
"radGridView1"
;
//
// radSchedulerNavigator1
//
this
.radSchedulerNavigator1.AssociatedScheduler =
this
.radScheduler1;
this
.radSchedulerNavigator1.DateFormat =
"yyyy/MM/dd"
;
this
.radSchedulerNavigator1.Dock = System.Windows.Forms.DockStyle.Top;
this
.radSchedulerNavigator1.Location =
new
System.Drawing.Point(0, 0);
this
.radSchedulerNavigator1.Name =
"radSchedulerNavigator1"
;
this
.radSchedulerNavigator1.NavigationStepType = Telerik.WinControls.UI.NavigationStepTypes.Day;
//
//
//
this
.radSchedulerNavigator1.RootElement.StretchVertically =
false
;
this
.radSchedulerNavigator1.Size =
new
System.Drawing.Size(1242, 77);
this
.radSchedulerNavigator1.TabIndex = 1;
this
.radSchedulerNavigator1.Text =
"radSchedulerNavigator1"
;
//
// radScheduler1
//
dateTimeInterval1.End =
new
System.DateTime(((
long
)(0)));
this
.radScheduler1.AccessibleInterval = dateTimeInterval1;
this
.radScheduler1.AppointmentTitleFormat =
null
;
this
.radScheduler1.Culture =
new
System.Globalization.CultureInfo(
"nl-NL"
);
this
.radScheduler1.DataSource =
null
;
this
.radScheduler1.Dock = System.Windows.Forms.DockStyle.Fill;
this
.radScheduler1.GroupType = Telerik.WinControls.UI.GroupType.None;
this
.radScheduler1.HeaderFormat =
"dd dddd"
;
this
.radScheduler1.Location =
new
System.Drawing.Point(0, 77);
this
.radScheduler1.Name =
"radScheduler1"
;
this
.radScheduler1.Padding =
new
System.Windows.Forms.Padding(0, 0, 0, 1);
this
.radScheduler1.Size =
new
System.Drawing.Size(1242, 341);
this
.radScheduler1.TabIndex = 2;
this
.radScheduler1.Text =
"radScheduler1"
;
//
// RadForm1
//
this
.AutoScaleDimensions =
new
System.Drawing.SizeF(6F, 13F);
this
.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this
.ClientSize =
new
System.Drawing.Size(1242, 568);
this
.Controls.Add(
this
.radScheduler1);
this
.Controls.Add(
this
.radSchedulerNavigator1);
this
.Controls.Add(
this
.radGridView1);
this
.Name =
"RadForm1"
;
//
//
//
this
.RootElement.ApplyShapeToControl =
true
;
this
.Text =
"RadForm1"
;
this
.ThemeName =
"ControlDefault"
;
((System.ComponentModel.ISupportInitialize)(
this
.radGridView1.MasterTemplate)).EndInit();
((System.ComponentModel.ISupportInitialize)(
this
.radGridView1)).EndInit();
((System.ComponentModel.ISupportInitialize)(
this
.radSchedulerNavigator1)).EndInit();
((System.ComponentModel.ISupportInitialize)(
this
.radScheduler1)).EndInit();
((System.ComponentModel.ISupportInitialize)(
this
)).EndInit();
this
.ResumeLayout(
false
);
this
.PerformLayout();
}
#endregion
private
Telerik.WinControls.UI.RadGridView radGridView1;
private
Telerik.WinControls.UI.RadSchedulerNavigator radSchedulerNavigator1;
private
Telerik.WinControls.UI.RadScheduler radScheduler1;
}
Meeting file
class
Meeting
{
public
int
Id {
get
;
set
; }
public
String Name {
get
;
set
; }
public
int
DurationHours {
get
;
set
; }
public
int
People {
get
;
set
; }
public
Meeting(
int
id,
string
name,
int
duration,
int
nrPeople)
{
this
.Id = id;
this
.Name = name;
this
.DurationHours = duration;
this
.People = nrPeople;
}
}
0
Richard Slade
Top achievements
Rank 2
answered on 07 Feb 2011, 03:38 PM
Hello,
When you change the Active View, you will need to re-assign the ResourcesPerView.
Have a look at this blog article which explains.
hope that helps
Richard
When you change the Active View, you will need to re-assign the ResourcesPerView.
Have a look at this blog article which explains.
hope that helps
Richard
0
Gerben
Top achievements
Rank 1
answered on 08 Feb 2011, 09:00 AM
Thanks for this info. The issue with the view has been resolved. Have you checked out the code for the drag & drop?
0
Richard Slade
Top achievements
Rank 2
answered on 08 Feb 2011, 10:38 AM
Hello,
Yes, I'm having a look at it, but haven't come up with a working solution at present. I'll let you know as soon as I do/if I can.
regards,
Richard
Yes, I'm having a look at it, but haven't come up with a working solution at present. I'll let you know as soon as I do/if I can.
regards,
Richard
0
Richard Slade
Top achievements
Rank 2
answered on 08 Feb 2011, 11:50 AM
Hello,
When you perform drag and drop for a scheduler grouped by resource, your resources need ids, and you need to get back the resource Id for the cell that you are dropping to .
I have altered the following code. Please can you try this.
Form Load. Now adds in a resource Id for each resource
DragDrop event, now just gets the cell element from ElementAtPoint method, and gets the resource id required to create the appointment in the right place (against the right resource) from the DayViewBase
Hope that helps
Richard
When you perform drag and drop for a scheduler grouped by resource, your resources need ids, and you need to get back the resource Id for the cell that you are dropping to .
I have altered the following code. Please can you try this.
Form Load. Now adds in a resource Id for each resource
public
Form1()
{
RadControlSpyForm f =
new
RadControlSpyForm();
f.Show();
InitializeComponent();
Resource r1 =
new
Resource();
r1.Name =
"Office 1"
;
r1.Id =
new
EventId(1);
r1.Color = Color.Blue;
Resource r2 =
new
Resource();
r2.Name =
"Office 2"
;
r2.Id =
new
EventId(2);
r2.Color = Color.Red;
Resource r3 =
new
Resource();
r3.Name =
"Office 3"
;
r3.Id =
new
EventId(3);
r3.Color = Color.Gray;
Resource r4 =
new
Resource();
r4.Name =
"Office 4"
;
r4.Id =
new
EventId(4);
r4.Color = Color.Yellow;
this
.radScheduler1.Resources.Add(r1);
this
.radScheduler1.Resources.Add(r2);
this
.radScheduler1.Resources.Add(r3);
this
.radScheduler1.Resources.Add(r4);
this
.radScheduler1.GroupType = GroupType.Resource;
this
.radScheduler1.AllowDrop =
true
;
this
.radScheduler1.DragEnter +=
new
DragEventHandler(radScheduler1_DragEnter);
this
.radScheduler1.DragDrop +=
new
DragEventHandler(radScheduler1_DragDrop);
this
.radScheduler1.GetDayView().DayCount = 1;
this
.radScheduler1.GetDayView().ResourcesPerView = 4;
this
.FillGrid();
this
.radGridView1.DataSource =
this
.meetings;
this
.radGridView1.GridBehavior =
new
MyGridBehavior();
}
DragDrop event, now just gets the cell element from ElementAtPoint method, and gets the resource id required to create the appointment in the right place (against the right resource) from the DayViewBase
void
radScheduler1_DragDrop(
object
sender, DragEventArgs e)
{
Point point =
this
.radScheduler1.PointToClient(
new
Point(e.X, e.Y));
SchedulerCellElement schedulerCell = (SchedulerCellElement)
this
.radScheduler1.ElementTree.GetElementAtPoint(point);
EventId id = ((Telerik.WinControls.UI.DayViewAppointmentsTable)schedulerCell.Parent).DayViewBase.GetResources()[0].Id;
DragObject dragObject = e.Data.GetData(
typeof
(DragObject))
as
DragObject;
if
(dragObject !=
null
)
{
this
.radScheduler1.Appointments.BeginUpdate();
Appointment appointment = CreateAppointment(schedulerCell.Date, dragObject);
appointment.ResourceId = id;
this
.radScheduler1.Appointments.Add(appointment);
this
.radScheduler1.Appointments.EndUpdate();
this
.radGridView1.Rows.RemoveAt(
this
.radGridView1.SelectedRows[0].Index);
}
}
Hope that helps
Richard
0
Richard Slade
Top achievements
Rank 2
answered on 08 Feb 2011, 01:14 PM
Hi again,
I've been testing what I sent you and it seems to work really well. The only thing is that it currently errors if you try and drag an appointment over an existing appointment. What did you want to do in this situation? (Ie - create a second appointment or disallow)
thanks
Richard
I've been testing what I sent you and it seems to work really well. The only thing is that it currently errors if you try and drag an appointment over an existing appointment. What did you want to do in this situation? (Ie - create a second appointment or disallow)
thanks
Richard
0
Gerben
Top achievements
Rank 1
answered on 08 Feb 2011, 01:19 PM
Hi Richard,
Thanks for the sample. As answer to your question. Creating a second appointment would be nice.
Thanks for the sample. As answer to your question. Creating a second appointment would be nice.
0
Accepted
Richard Slade
Top achievements
Rank 2
answered on 08 Feb 2011, 01:37 PM
Hi Gerben,
This should do the job. May need a little tidying up, but it seems to work fine.
hope that helps
Richard
This should do the job. May need a little tidying up, but it seems to work fine.
void
radScheduler1_DragDrop(
object
sender, DragEventArgs e)
{
Point point =
this
.radScheduler1.PointToClient(
new
Point(e.X, e.Y));
SchedulerCellElement schedulerCell;
AppointmentElement appointmentElement;
EventId id =
new
EventId(0);
DateTime date =
new
DateTime();
if
(
this
.radScheduler1.ElementTree.GetElementAtPoint(point)
is
SchedulerCellElement)
{
schedulerCell = (SchedulerCellElement)
this
.radScheduler1.ElementTree.GetElementAtPoint(point);
id = ((Telerik.WinControls.UI.DayViewAppointmentsTable)schedulerCell.Parent).DayViewBase.GetResources()[0].Id;
date = schedulerCell.Date;
}
else
if
(
this
.radScheduler1.ElementTree.GetElementAtPoint(point)
is
AppointmentElement)
{
appointmentElement = (AppointmentElement)
this
.radScheduler1.ElementTree.GetElementAtPoint(point);
id = ((Telerik.WinControls.UI.DayViewAppointmentsTable)appointmentElement.Parent).DayViewBase.GetResources()[0].Id;
date = appointmentElement.Start;
}
DragObject dragObject = e.Data.GetData(
typeof
(DragObject))
as
DragObject;
if
(dragObject !=
null
)
{
this
.radScheduler1.Appointments.BeginUpdate();
Appointment appointment = CreateAppointment(date, dragObject);
appointment.ResourceId = id;
this
.radScheduler1.Appointments.Add(appointment);
this
.radScheduler1.Appointments.EndUpdate();
this
.radGridView1.Rows.RemoveAt(
this
.radGridView1.SelectedRows[0].Index);
}
}
hope that helps
Richard
0
Gerben
Top achievements
Rank 1
answered on 14 Feb 2011, 10:27 AM
Thanks a lot. This was exactly what I needed.
0
Richard Slade
Top achievements
Rank 2
answered on 14 Feb 2011, 10:51 AM
Glad I could be of help.
All the best
Richard
All the best
Richard