Telerik RadGanttView示例

TicksToTimeSpanConverter.cs
using System;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Data;

using System.Globalization;



namespace SGSGHome.Views.TaskTrace

{

    public class TicksToTimeSpanConverter : IValueConverter

    {

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

        {

            return TimeSpan.FromTicks((long)(double)value);

        }



        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

        {

            throw new NotImplementedException();

        }

    }

}
<UserControl x:Class="SGSGHome.Views.TaskTrace.TaskGantt"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"

    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"

    xmlns:local="clr-namespace:SGSGHome.Views.TaskTrace"

    d:DesignWidth="1200" d:DesignHeight="600">

    <UserControl.Resources>

        <local:TicksToTimeSpanConverter x:Key="TicksToTimeSpanConverter" />

    </UserControl.Resources>

    <Grid x:Name="LayoutRoot">

        <Grid.RowDefinitions>

            <RowDefinition Height="30" />

            <RowDefinition Height="*" />

        </Grid.RowDefinitions>

        <StackPanel Grid.Row="0" Margin="3" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">

            <TextBlock VerticalAlignment="Center">时间范围:从</TextBlock>

            <sdk:DatePicker Name="FromDate"></sdk:DatePicker>

            <TextBlock VerticalAlignment="Center">至</TextBlock>

            <sdk:DatePicker Name="ToDate"></sdk:DatePicker>

            <TextBlock VerticalAlignment="Center" Margin="3">项目名称:</TextBlock>

            <ComboBox Name="cbProject" Width="150" Height="20"></ComboBox>

            <Button Name="btnOK" Content="确定" Width="50" Height="22" Click="btnOK_Click" Margin="3,0,0,0"></Button>



            <!-- ZOOM slider-->

            <TextBlock VerticalAlignment="Center" Margin="3,0,0,0">放大</TextBlock>

            <Border BorderBrush="Gray" BorderThickness="1" Margin="2">

            <telerik:RadSlider  VerticalAlignment="Center" Width="120" x:Name="PixelLength"

                    Minimum="10000000" Maximum="60000000000" Value="35000000000"/>

            </Border>

            <TextBlock VerticalAlignment="Center">缩小</TextBlock>

        </StackPanel>

        <telerik:RadGanttView x:Name="ganttView" 

            HorizontalAlignment="Stretch" 

            VerticalAlignment="Stretch" 

            MouseLeftButtonDown="ganttView_MouseLeftButtonDown" 

            Grid.Row="1"

            PixelLength="{Binding Value, ElementName=PixelLength, Converter={StaticResource TicksToTimeSpanConverter}}">

            <telerik:RadGanttView.Columns>

                <telerik:TreeColumnDefinition Header="任务名称" />

                <telerik:ColumnDefinition MemberBinding="{Binding AssignTo}" Header="负责人" ColumnWidth="200" />

                <telerik:ColumnDefinition MemberBinding="{Binding ProgressString}" Header="任务进度" ColumnWidth="80" />

                <telerik:ColumnDefinition MemberBinding="{Binding HasDoc}" Header="文档"/>

                <telerik:ColumnDefinition MemberBinding="{Binding Start,StringFormat=yyyy-MM-dd}" Header="开始时间" ColumnWidth="100" />

                <telerik:ColumnDefinition MemberBinding="{Binding End,StringFormat=yyyy-MM-dd}" Header="预计完成时间" ColumnWidth="100" />

                <telerik:ColumnDefinition MemberBinding="{Binding ActualFinishDate,StringFormat=yyyy-MM-dd}" Header="实际完成时间" ColumnWidth="100" />

            </telerik:RadGanttView.Columns>

        </telerik:RadGanttView>

    </Grid>

</UserControl>
using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;



using Telerik.Windows.Controls.GanttView;

using Telerik.Windows.Controls.Scheduling;

using System.Collections.ObjectModel;



namespace SGSGHome.Views.TaskTrace

{

    public class GanttTaskEx : GanttTask

    {

        public string AssignTo { get; set; }

        public string ProgressString { get; set; }

        public string PreTaskName { get; set; }

        public DateTime? ActualFinishDate { get; set; }

        public string HasDoc { get; set; }

        public GanttTaskEx() { }

        public GanttTaskEx(DateTime start, DateTime end, string title) : base(start, end, title) { }

    }



    public partial class TaskGantt : UserControl

    {

        public bool IsManager { get; set; }



        public ObservableCollection<TaskTraceService.TaskTrace> TaskTraceList { get; set; }

        public ObservableCollection<TaskTraceService.v_TaskDocCount> TaskDocCountList { get; set; }

        public GanttTaskEx Root { get; set; }

        TaskTraceService.TaskServiceClient client;

        CoreService.CoreServiceClient xClient;



        public TaskGantt()

        {

            InitializeComponent();

            this.Loaded += new RoutedEventHandler(TaskGantt_Loaded);

        }



        void TaskGantt_Loaded(object sender, RoutedEventArgs e)

        {

            FromDate.SelectedDate = DateTime.Now.AddDays(-15);

            ToDate.SelectedDate = DateTime.Now.AddDays(15);

            this.TaskTraceList = new ObservableCollection<TaskTraceService.TaskTrace>();



            xClient = new CoreService.CoreServiceClient();

            xClient.HasRightCompleted += new EventHandler<CoreService.HasRightCompletedEventArgs>(xClient_HasRightCompleted);



            client = new TaskTraceService.TaskServiceClient();

            client.GetTaskByProjectNoCompleted += new EventHandler<TaskTraceService.GetTaskByProjectNoCompletedEventArgs>(client_GetTaskByProjectNoCompleted);

            client.GetTaskByMemberCompleted += new EventHandler<TaskTraceService.GetTaskByMemberCompletedEventArgs>(client_GetTaskByMemberCompleted);

            client.GetProjectNoListCompleted += new EventHandler<TaskTraceService.GetProjectNoListCompletedEventArgs>(client_GetProjectNoListCompleted);

            client.GetProjectNoListAsync();



            client.GetTaskDocCountCompleted += new EventHandler<TaskTraceService.GetTaskDocCountCompletedEventArgs>(client_GetTaskDocCountCompleted);

            client.GetTaskDocCountAsync();



        }



        void client_GetTaskDocCountCompleted(object sender, TaskTraceService.GetTaskDocCountCompletedEventArgs e)

        {

            TaskDocCountList = e.Result;

        }



        void client_GetTaskByProjectNoCompleted(object sender, TaskTraceService.GetTaskByProjectNoCompletedEventArgs e)

        {

            TaskTraceList = e.Result;

            if (e.Result.Count > 0)

            {

                FromDate.SelectedDate = e.Result.Min(x => x.StartDate).AddDays(-1);

                ToDate.SelectedDate = e.Result.Max(x => x.FinishDate).AddDays(1);

                this.Root = new GanttTaskEx(e.Result.Min(x => x.StartDate), e.Result.Max(x => x.FinishDate), ((TaskTraceService.ProjectBuild)cbProject.SelectedItem).ProjectName);

                AddChild(TaskTraceList, null, Root);

            }

            else

            {

                Root = null;

            }

        }



        void xClient_HasRightCompleted(object sender, CoreService.HasRightCompletedEventArgs e)

        {

            IsManager = AppContext.IsSupervisor || e.Result;

            cbProject_SelectionChanged(null, null);

        }



        void client_GetProjectNoListCompleted(object sender, TaskTraceService.GetProjectNoListCompletedEventArgs e)

        {

            if (e.Result.Count > 0)

            {

                cbProject.ItemsSource = e.Result;

                cbProject.DisplayMemberPath = "ProjectName";

                cbProject.SelectedValuePath = "ProjectNo";

                cbProject.SelectedIndex = 0;

                cbProject.SelectionChanged += new SelectionChangedEventHandler(cbProject_SelectionChanged);



                xClient.HasRightAsync(AppContext.LogonUserID, "SGSGHome.Views.TaskTrace.TaskManage", Operation.GetTagName(Operation.Tag.All));

            }

        }



        void cbProject_SelectionChanged(object sender, SelectionChangedEventArgs e)

        {

            if (IsManager)

            {

                client.GetTaskByProjectNoAsync(cbProject.SelectedValue.ToString());

            }

            else

            {

                client.GetTaskByMemberAsync(AppContext.LogonUserName, cbProject.SelectedValue.ToString());

            }

        }



        void client_GetTaskByMemberCompleted(object sender, TaskTraceService.GetTaskByMemberCompletedEventArgs e)

        {

            TaskTraceList = e.Result;

            if (e.Result.Count > 0)

            {

                FromDate.SelectedDate = e.Result.Min(x => x.StartDate).AddDays(-1);

                ToDate.SelectedDate = e.Result.Max(x => x.FinishDate).AddDays(1);

                this.Root = new GanttTaskEx(e.Result.Min(x => x.StartDate), e.Result.Max(x => x.FinishDate), ((TaskTraceService.ProjectBuild)cbProject.SelectedItem).ProjectName);

                AddChild(TaskTraceList, null, Root);

            }

            else

            {

                Root = null;

            }

        }



        private void ganttView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        {

            if (e.ClickCount == 2)

            {

                var r = ganttView.SelectedItem as GanttTaskEx;

                if (r != null && r.UniqueId != null)

                {

                    var w = new OutputDoc();

                    w.TaskTrace = TaskTraceList.Single(x => x.TaskID == long.Parse(r.UniqueId));

                    w.CurrentUser = AppContext.LogonUserName;

                    w.Show();

                }

            }

        }



        private void btnOK_Click(object sender, RoutedEventArgs e)

        {

            if (FromDate.SelectedDate != null && ToDate.SelectedDate != null)

            {

                if (FromDate.SelectedDate.Value < ToDate.SelectedDate.Value)

                {

                    if (Root != null)

                    {

                        ganttView.VisibleRange = new VisibleRange(FromDate.SelectedDate.Value, ToDate.SelectedDate.Value);

                        ganttView.TasksSource = new ObservableCollection<GanttTaskEx>() { Root };

                    }

                    else

                    {

                        MessageBox.Show("没有数据!", "提示", MessageBoxButton.OK);

                    }

                }

            }

        }



        void AddChild(IList<TaskTraceService.TaskTrace> dataList, long? preTaskID, GanttTaskEx preTask)

        {

            var filterList = dataList.Where(x => x.PreTaskID == preTaskID).ToList();



            foreach (var tt in filterList)

            {

                var childTask = new GanttTaskEx()

                {

                    Start = tt.StartDate,

                    End = tt.FinishDate,

                    Title = tt.TaskName,

                    ActualFinishDate = tt.ActualFinishDate,

                    AssignTo = tt.AssignTo,

                    Progress = (double)tt.CompletePercent,

                    ProgressString = ((double)tt.CompletePercent).ToString() + "%",

                    UniqueId = tt.TaskID.ToString(),

                    PreTaskName = tt.PreTaskName,

                    HasDoc = TaskDocCountList.Any(x => x.TaskID == tt.TaskID) ? "" : ""

                };



                preTask.Children.Add(childTask);

                var childrenList = TaskTraceList.Where(x => x.PreTaskID == tt.TaskID).ToList();

                if (childrenList.Count > 0)

                {

                    AddChild(childrenList, tt.TaskID, childTask);

                }

            }

        }

    }

}

 

你可能感兴趣的:(gantt)