このトピックは、複数のテーブルから三次元データまたは通常のデータを取得して、仮想テーブルにデータを配置する方法のデモを行うサンプル コードを提供します。Chart コントロールはこれを表示できます。
たとえば、以下の画像は、チャートに基づく 3 つの別々のテーブルを説明しています。
Chart コントロールはデータをグラフ化するためにフラット データ セットが必要です。したがって、以下のテーブルの例に示すように、データをフラット レコードセットに変換する必要があります。
すべてのテーブルは、列および行の数が同じでなければなりません。そうでなければ、コードを自分の状況に合わせて変更する必要があります。以下のサンプル コードでは、3 列、3 行から成るテーブルを使用しています。事前定義のテーブルで作業している場合、必ずこの条件に合わせてください。
Visual Basic の場合:
' 各テーブルを作成して dataSet に追加します。
Dim dataSet1 As New DataSet("MarketDataSet")
Dim Market1 As DataTable = dataSet1.Tables.Add("Market1")
Dim Market2 As DataTable = dataSet1.Tables.Add("Market2")
Dim Market3 As DataTable = dataSet1.Tables.Add("Market3")
' 列および行を各テーブルに追加します。
Dim rnd As Random = New Random(0)
Dim x As Integer
For x = 0 To dataSet1.Tables.Count - 1
' ラベル列を追加します
dataSet1.Tables(x).Columns.Add("Time", GetType(String))
' 3 つのデータ列を追加します。
Dim z As Integer
For z = 0 To 2
dataSet1.Tables(x).Columns.Add("Product " & (z + 1), GetType(Double))
Next z
' 行をテーブルに追加します。
Dim y As Integer
For y = 0 To 2
dataSet1.Tables(x).Rows.Add(New Object() {"time " & (y + 1), _
rnd.Next(1, 10), rnd.Next(1, 10), rnd.Next(1, 10)})
Next y
Next x
C# の場合:
// 各テーブルを作成して dataSet に追加します。
DataSet dataSet= new DataSet("MarketDataSet");
DataTable Market1=dataSet.Tables.Add("Market1");
DataTable Market2=dataSet.Tables.Add("Market2");
DataTable Market3=dataSet.Tables.Add("Market3");
// 列および行を各テーブルに追加します。
Random rnd = new Random(0);
for(short x=0; x<dataSet.Tables.Count; x++)
{
// ラベル列を追加します。
dataSet.Tables[x].Columns.Add("Time",typeof(string));
// 3 つのデータ列を追加します。
for(short i=0; i<3; i++)
{
dataSet.Tables[x].Columns.Add("Product " + (i+1),typeof(double));
}
// 行をテーブルに追加します。
for(short y=0; y<3; y++)
{
dataSet.Tables[x].Rows.Add(new Object[]{"time " + (y+1),
rnd.Next(1,10),rnd.Next(1,10),rnd.Next(1,10) });
}
}
2 つのデータセットからデータを取り込み、チャート要素で使用可能な単一のテーブルに格納します。
Visual Basic の場合:
' これらのテーブルを 1 つに変換します。
Dim AllMarkets As DataTable = dataSet1.Tables.Add("AllMarkets")
AllMarkets.Columns.Add("LabelsColumns")
Dim i As Integer
For i = 0 To (dataSet1.Tables.Count - 2)
AllMarkets.Columns.Add(dataSet1.Tables(i).TableName, GetType(Double))
Next i
Dim table1 As DataTable = dataSet1.Tables(0)
Dim table2 As DataTable = dataSet1.Tables(1)
Dim table3 As DataTable = dataSet1.Tables(2)
Dim Pcnt As Integer = 1
' これは製品番号の追跡を維持します。
Dim Tcnt As Integer = 1
' これはタイム番号の追跡を維持します。
For i = 0 To (((table1.Rows.Count) $$*$$ (table1.Columns.Count - 1)) - 1)
' タイム カウントが 4 の場合、タイム カウントを 1 にリセットし、
' 製品カウントを 1 つだけ増やします。
' これらのカウンタは、新しいテーブルに挿入する製品番号と
' タイム番号の追跡を維持します。
If Tcnt = 4 Then
Pcnt += 1
Tcnt = 1
End If
' 新しい行をテーブルに追加します。
' セル 1 は列名と行ラベルの組み合わせです。
' 後続のセルは、メソッドを使用して元のテーブルから値が取得されます。
' table1.Rows(Tcnt-1)(Pcnt)。カウントに基づいて、最初のパラメータは行番号。
' 2 番目のパラメータは列番号。
AllMarkets.Rows.Add(New Object() {table1.Columns(Pcnt).ColumnName + " " + _
table1.Rows(Tcnt - 1)(0), table1.Rows(Tcnt - 1)(Pcnt), table2.Rows(Tcnt - 1)(Pcnt), table3.Rows(Tcnt - 1)(Pcnt)})
Tcnt += 1
Next i
Me.UltraChart1.Data.DataSource = dataSet1.Tables("AllMarkets")
C# の場合:
// これらのテーブルを 1 つに変換します。
DataTable AllMarkets=dataSet.Tables.Add("AllMarkets");
AllMarkets.Columns.Add("LabelsColumns");
for(short i=0;i<dataSet.Tables.Count-1; i++)
{
AllMarkets.Columns.Add(dataSet.Tables[i].TableName, typeof(double));
}
DataTable table1=dataSet.Tables[0];
DataTable table2=dataSet.Tables[1];
DataTable table3=dataSet.Tables[2];
int Pcnt=1;
// これは製品番号の追跡を維持します。
int Tcnt=1;
// これはタイム番号の追跡を維持します。
for (short i=0; i<table1.Rows.Count$$*$$(table1.Columns.Count-1); i++)
{
// タイム カウントが 4 の場合、タイム カウントを 1 にリセットし、製品カウントを 1 つだけ増やします。
// これらのカウンタは、新しいテーブルに挿入する製品番号とタイム番号の追跡を維持します。
if(Tcnt==4)
{
Pcnt+=1;
Tcnt=1;
}
// 新しい行をテーブルに追加します。
// セル 1 は、列名と行ラベルの組み合わせです。
// 後続のセルは、メソッドを使用して元のテーブルから値が取得されます。
// table1.Rows[Tcnt-1][Pcnt]。 カウントに基づいて、最初のパラメータは行番号。2 番目のパラメータは列番号。
AllMarkets.Rows.Add(new Object[]{table1.Columns[Pcnt].ColumnName+ " " + table1.Rows[Tcnt-1][0],table1.Rows[Tcnt-1][Pcnt],table2.Rows[Tcnt-1][Pcnt],table3.Rows[Tcnt-1][Pcnt]});
Tcnt+=1;
}
this.ultraChart1.Data.DataSource=dataSet.Tables["AllMarkets"];
最終チャートは以下の画像のようになります。