作成日: 2019/04/04 最終更新日: 2019/04/04
文書種別
使用方法
詳細
ガントチャートを指定した日付までスクロールするには、C1GanttViewのチャートビューとして内部的に用いられているC1FlexGridのScrollPositionプロパティを使用します。スクロール機能を実装するための手順は次の通りです。
1. C1GanttViewのチャート部の幅をC1FlexGridのCols[0].WidthDisplayで取得します。
※チャートビューでは列数=1のC1FlexGridが用いられているため。
2. C1GanttViewのChartStartDateとChartFinishDateの差から、チャート部全体の期間を算出します。
3. チャート部の幅をこの期間で割って、単位時間当たり(分ごと)のチャート幅を計算します。
4. 指定した日付とChartStartDateの差から、スクロールすべき期間をを算出します。
5. これに単位時間当たりのチャート幅を掛けて、必要なスクロール量を計算します。
6. C1FlexGridのScrollPositionプロパティに、この値を設定します。
これにより、希望する日付までスクロールさせることが可能となります。以下にこのスクロール機能を実装するためのコード(ScrollToDateメソッド)を紹介します。
◎サンプルコード(VB)
◎サンプルコード(C#)
なお、上記コードはコントロールがレンダリングされた後にしか機能しない(Form1_Loadイベント内では機能しない)ため、画面を起動した時点で特定の日付けまでスクロールして表示するには、Form1_Loadイベント内でタイマーを使用し、フォーム表示直後にこのメソッドを呼び出すといった工夫が必要です。この点を考慮したコード全体を次に記載します。このサンプルコードでは、フォーム起動時に「今日」にスクロールし、ボタンクリックで「昨日」にスクロールします。
◎サンプルコード(VB)
◎サンプルコード(C#)
1. C1GanttViewのチャート部の幅をC1FlexGridのCols[0].WidthDisplayで取得します。
※チャートビューでは列数=1のC1FlexGridが用いられているため。
2. C1GanttViewのChartStartDateとChartFinishDateの差から、チャート部全体の期間を算出します。
3. チャート部の幅をこの期間で割って、単位時間当たり(分ごと)のチャート幅を計算します。
4. 指定した日付とChartStartDateの差から、スクロールすべき期間をを算出します。
5. これに単位時間当たりのチャート幅を掛けて、必要なスクロール量を計算します。
6. C1FlexGridのScrollPositionプロパティに、この値を設定します。
これにより、希望する日付までスクロールさせることが可能となります。以下にこのスクロール機能を実装するためのコード(ScrollToDateメソッド)を紹介します。
◎サンプルコード(VB)
Private Sub ScrollToDate([date] As Date)
Dim chartView = CType(C1GanttView1.Controls(0), C1.Win.C1FlexGrid.C1FlexGrid)
Dim totalScroll As Double = chartView.Cols(0).WidthDisplay
Dim totalMinutes = C1GanttView1.ChartFinishDate.Value.Subtract(C1GanttView1.ChartStartDate.Value).TotalMinutes
Dim scrollPerMinute = totalScroll / totalMinutes
Dim requiredScrollX As Integer = [date].Subtract(C1GanttView1.ChartStartDate.Value).TotalMinutes * scrollPerMinute
' 見やすさを考慮し、requiredScrollX に BottomTier.MinWidth を足して、指定日の前に1列多めに表示させます。
chartView.ScrollPosition = New Point(-requiredScrollX + C1GanttView1.Timescale.BottomTier.MinWidth,
chartView.ScrollPosition.Y)
End Sub
Dim chartView = CType(C1GanttView1.Controls(0), C1.Win.C1FlexGrid.C1FlexGrid)
Dim totalScroll As Double = chartView.Cols(0).WidthDisplay
Dim totalMinutes = C1GanttView1.ChartFinishDate.Value.Subtract(C1GanttView1.ChartStartDate.Value).TotalMinutes
Dim scrollPerMinute = totalScroll / totalMinutes
Dim requiredScrollX As Integer = [date].Subtract(C1GanttView1.ChartStartDate.Value).TotalMinutes * scrollPerMinute
' 見やすさを考慮し、requiredScrollX に BottomTier.MinWidth を足して、指定日の前に1列多めに表示させます。
chartView.ScrollPosition = New Point(-requiredScrollX + C1GanttView1.Timescale.BottomTier.MinWidth,
chartView.ScrollPosition.Y)
End Sub
◎サンプルコード(C#)
private void ScrollToDate(DateTime date)
{
var chartView = c1GanttView1.Controls[0] as C1.Win.C1FlexGrid.C1FlexGrid;
double totalScroll = chartView.Cols[0].WidthDisplay;
double totalMinutes = c1GanttView1.ChartFinishDate.Value.Subtract(c1GanttView1.ChartStartDate.Value).TotalMinutes;
var scrollPerMinute = totalScroll / totalMinutes;
var requiredScrollX = (int)(date.Subtract(c1GanttView1.ChartStartDate.Value).TotalMinutes * scrollPerMinute);
// 見やすさを考慮し、requiredScrollX に BottomTier.MinWidth を足して、指定日の前に1列多めに表示する
chartView.ScrollPosition = new Point(-requiredScrollX + c1GanttView1.Timescale.BottomTier.MinWidth,
chartView.ScrollPosition.Y);
}
{
var chartView = c1GanttView1.Controls[0] as C1.Win.C1FlexGrid.C1FlexGrid;
double totalScroll = chartView.Cols[0].WidthDisplay;
double totalMinutes = c1GanttView1.ChartFinishDate.Value.Subtract(c1GanttView1.ChartStartDate.Value).TotalMinutes;
var scrollPerMinute = totalScroll / totalMinutes;
var requiredScrollX = (int)(date.Subtract(c1GanttView1.ChartStartDate.Value).TotalMinutes * scrollPerMinute);
// 見やすさを考慮し、requiredScrollX に BottomTier.MinWidth を足して、指定日の前に1列多めに表示する
chartView.ScrollPosition = new Point(-requiredScrollX + c1GanttView1.Timescale.BottomTier.MinWidth,
chartView.ScrollPosition.Y);
}
なお、上記コードはコントロールがレンダリングされた後にしか機能しない(Form1_Loadイベント内では機能しない)ため、画面を起動した時点で特定の日付けまでスクロールして表示するには、Form1_Loadイベント内でタイマーを使用し、フォーム表示直後にこのメソッドを呼び出すといった工夫が必要です。この点を考慮したコード全体を次に記載します。このサンプルコードでは、フォーム起動時に「今日」にスクロールし、ボタンクリックで「昨日」にスクロールします。
◎サンプルコード(VB)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
C1GanttView1.Tasks.ClearAndDispose()
C1GanttView1.Tasks.AddRange(GetTasks().ToArray())
' タイマーを使用してScrollToDateを呼び出す
Timer1.Interval = 200
AddHandler Timer1.Tick, AddressOf Timer1_Tick
Timer1.Start()
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Timer1.Stop()
' 今日の日付までスクロール
ScrollToDate(DateTime.Today)
End Sub
Private Sub BtnScrollToYesterday_Click(sender As Object, e As EventArgs) Handles BtnScrollToYesterday.Click
' 昨日の日付までスクロール
ScrollToDate(DateTime.Today.AddDays(-1))
End Sub
Private Sub ScrollToDate([date] As Date)
Dim chartView = CType(C1GanttView1.Controls(0), C1.Win.C1FlexGrid.C1FlexGrid)
Dim totalScroll As Double = chartView.Cols(0).WidthDisplay
Dim totalMinutes = C1GanttView1.ChartFinishDate.Value.Subtract(C1GanttView1.ChartStartDate.Value).TotalMinutes
Dim scrollPerMinute = totalScroll / totalMinutes
Dim requiredScrollX As Integer = [date].Subtract(C1GanttView1.ChartStartDate.Value).TotalMinutes * scrollPerMinute
' 見やすさを考慮し、requiredScrollX に BottomTier.MinWidth を足して、指定日の前に1列多めに表示
chartView.ScrollPosition = New Point(-requiredScrollX + C1GanttView1.Timescale.BottomTier.MinWidth,
chartView.ScrollPosition.Y)
End Sub
Private Function GetTasks() As List(Of C1.Win.C1GanttView.Task)
Dim tasks = New List(Of C1.Win.C1GanttView.Task)()
Dim random = New Random()
For i = 1 To 30
Dim task = New C1.Win.C1GanttView.Task()
task.Name = $"Task #{i}"
task.Start = New Date(2019, random.Next(1, 4), random.Next(1, 29))
task.Duration = random.Next(2, 6)
tasks.Add(task)
Next
Return tasks
End Function
C1GanttView1.Tasks.ClearAndDispose()
C1GanttView1.Tasks.AddRange(GetTasks().ToArray())
' タイマーを使用してScrollToDateを呼び出す
Timer1.Interval = 200
AddHandler Timer1.Tick, AddressOf Timer1_Tick
Timer1.Start()
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Timer1.Stop()
' 今日の日付までスクロール
ScrollToDate(DateTime.Today)
End Sub
Private Sub BtnScrollToYesterday_Click(sender As Object, e As EventArgs) Handles BtnScrollToYesterday.Click
' 昨日の日付までスクロール
ScrollToDate(DateTime.Today.AddDays(-1))
End Sub
Private Sub ScrollToDate([date] As Date)
Dim chartView = CType(C1GanttView1.Controls(0), C1.Win.C1FlexGrid.C1FlexGrid)
Dim totalScroll As Double = chartView.Cols(0).WidthDisplay
Dim totalMinutes = C1GanttView1.ChartFinishDate.Value.Subtract(C1GanttView1.ChartStartDate.Value).TotalMinutes
Dim scrollPerMinute = totalScroll / totalMinutes
Dim requiredScrollX As Integer = [date].Subtract(C1GanttView1.ChartStartDate.Value).TotalMinutes * scrollPerMinute
' 見やすさを考慮し、requiredScrollX に BottomTier.MinWidth を足して、指定日の前に1列多めに表示
chartView.ScrollPosition = New Point(-requiredScrollX + C1GanttView1.Timescale.BottomTier.MinWidth,
chartView.ScrollPosition.Y)
End Sub
Private Function GetTasks() As List(Of C1.Win.C1GanttView.Task)
Dim tasks = New List(Of C1.Win.C1GanttView.Task)()
Dim random = New Random()
For i = 1 To 30
Dim task = New C1.Win.C1GanttView.Task()
task.Name = $"Task #{i}"
task.Start = New Date(2019, random.Next(1, 4), random.Next(1, 29))
task.Duration = random.Next(2, 6)
tasks.Add(task)
Next
Return tasks
End Function
◎サンプルコード(C#)
public Form1()
{
InitializeComponent();
Load += Form1_Load;
}
private void Form1_Load(object sender, EventArgs e)
{
c1GanttView1.Tasks.ClearAndDispose();
c1GanttView1.Tasks.AddRange(GetTasks().ToArray());
btnScrollToYesterday.Click += BtnScrollToYesterday_Click;
// タイマーを使用してScrollToDateを呼び出す
timer1.Interval = 200;
timer1.Tick += timer1_Tick;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
// 今日の日付までスクロール
ScrollToDate(DateTime.Today);
}
private void BtnScrollToYesterday_Click(object sender, EventArgs e)
{
// 昨日の日付までスクロール
ScrollToDate(DateTime.Today.AddDays(-1));
}
private void ScrollToDate(DateTime date)
{
var chartView = c1GanttView1.Controls[0] as C1.Win.C1FlexGrid.C1FlexGrid;
double totalScroll = chartView.Cols[0].WidthDisplay;
double totalMinutes = c1GanttView1.ChartFinishDate.Value.Subtract(c1GanttView1.ChartStartDate.Value).TotalMinutes;
var scrollPerMinute = totalScroll / totalMinutes;
var requiredScrollX = (int)(date.Subtract(c1GanttView1.ChartStartDate.Value).TotalMinutes * scrollPerMinute);
// 見やすさを考慮し、requiredScrollX に BottomTier.MinWidth を足して、指定日の前に1列多めに表示
chartView.ScrollPosition = new Point(-requiredScrollX + c1GanttView1.Timescale.BottomTier.MinWidth,
chartView.ScrollPosition.Y);
}
private List GetTasks()
{
var tasks = new List();
var random = new Random();
for (int i = 1; i <= 30;="30;" ++i)="++i)">
{
var task = new C1.Win.C1GanttView.Task();
task.Name = $"Task #{i}";
task.Start = new DateTime(2019, random.Next(1, 4), random.Next(1, 29));
task.Duration = random.Next(2, 6);
tasks.Add(task);
}
return tasks;
}</=>
{
InitializeComponent();
Load += Form1_Load;
}
private void Form1_Load(object sender, EventArgs e)
{
c1GanttView1.Tasks.ClearAndDispose();
c1GanttView1.Tasks.AddRange(GetTasks().ToArray());
btnScrollToYesterday.Click += BtnScrollToYesterday_Click;
// タイマーを使用してScrollToDateを呼び出す
timer1.Interval = 200;
timer1.Tick += timer1_Tick;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Stop();
// 今日の日付までスクロール
ScrollToDate(DateTime.Today);
}
private void BtnScrollToYesterday_Click(object sender, EventArgs e)
{
// 昨日の日付までスクロール
ScrollToDate(DateTime.Today.AddDays(-1));
}
private void ScrollToDate(DateTime date)
{
var chartView = c1GanttView1.Controls[0] as C1.Win.C1FlexGrid.C1FlexGrid;
double totalScroll = chartView.Cols[0].WidthDisplay;
double totalMinutes = c1GanttView1.ChartFinishDate.Value.Subtract(c1GanttView1.ChartStartDate.Value).TotalMinutes;
var scrollPerMinute = totalScroll / totalMinutes;
var requiredScrollX = (int)(date.Subtract(c1GanttView1.ChartStartDate.Value).TotalMinutes * scrollPerMinute);
// 見やすさを考慮し、requiredScrollX に BottomTier.MinWidth を足して、指定日の前に1列多めに表示
chartView.ScrollPosition = new Point(-requiredScrollX + c1GanttView1.Timescale.BottomTier.MinWidth,
chartView.ScrollPosition.Y);
}
private List GetTasks()
{
var tasks = new List();
var random = new Random();
for (int i = 1; i <= 30;="30;" ++i)="++i)">
{
var task = new C1.Win.C1GanttView.Task();
task.Name = $"Task #{i}";
task.Start = new DateTime(2019, random.Next(1, 4), random.Next(1, 29));
task.Duration = random.Next(2, 6);
tasks.Add(task);
}
return tasks;
}</=>
関連情報
旧文書番号
83768