Drag & Drop using resource view

12 posts, 1 answers
  1. Gerben
    Gerben avatar
    14 posts
    Member since:
    Jul 2010

    Posted 07 Feb 2011 Link to this post

    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?
  2. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 07 Feb 2011 Link to this post

    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
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Gerben
    Gerben avatar
    14 posts
    Member since:
    Jul 2010

    Posted 07 Feb 2011 Link to this post

    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:
    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;
            }
     
        }
  5. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 07 Feb 2011 Link to this post

    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
  6. Gerben
    Gerben avatar
    14 posts
    Member since:
    Jul 2010

    Posted 08 Feb 2011 Link to this post

    Thanks for this info. The issue with the view has been resolved. Have you checked out the code for the drag & drop?
  7. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Feb 2011 Link to this post

    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
  8. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Feb 2011 Link to this post

    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
    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
  9. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Feb 2011 Link to this post

    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
  10. Gerben
    Gerben avatar
    14 posts
    Member since:
    Jul 2010

    Posted 08 Feb 2011 Link to this post

    Hi Richard,

    Thanks for the sample. As answer to your question. Creating a second appointment would be nice. 
  11. Answer
    Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 08 Feb 2011 Link to this post

    Hi Gerben,

    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
  12. Gerben
    Gerben avatar
    14 posts
    Member since:
    Jul 2010

    Posted 14 Feb 2011 Link to this post

    Thanks a lot. This was exactly what I needed.
  13. Richard Slade
    Richard Slade avatar
    3000 posts
    Member since:
    May 2009

    Posted 14 Feb 2011 Link to this post

    Glad I could be of help.
    All the best
    Richard
Back to Top
UI for WinForms is Visual Studio 2017 Ready