作成日: 2014/09/26 最終更新日: 2014/09/26
文書種別
使用方法
詳細
FlexGridでは、マージセルがスクロールされた場合、テキストがセルの表示領域内に留まるように表示されます。
この動作を通常のセルをスクロールした場合と同じように変更するには、オーナー描画機能を利用し、OwnerDrawCell イベント内で、非表示領域やスクロールによる移動を考慮した Rectangle オブジェクトを作成し、e.Graphics.DrawString メソッドでマージセルのテキストを描画する方法が考えられます。
◎サンプルコード(VB)
◎サンプルコード(C#)
この動作を通常のセルをスクロールした場合と同じように変更するには、オーナー描画機能を利用し、OwnerDrawCell イベント内で、非表示領域やスクロールによる移動を考慮した Rectangle オブジェクトを作成し、e.Graphics.DrawString メソッドでマージセルのテキストを描画する方法が考えられます。
◎サンプルコード(VB)
Public mWidth1, mWidth2 As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i
'' コントロールを初期化します。
fg.Styles.Normal.WordWrap = True
fg.Cols.Count = 9
fg.Rows.Fixed = 2
fg.AllowMerging = AllowMergingEnum.FixedOnly
'' 行ヘッダを定義します。
fg.Rows(0).AllowMerging = True
'' 4つのセルをマージします。
Dim rng As CellRange = fg.GetCellRange(0, 1, 0, 4)
rng.Data = "North"
'' 4つのセルをマージします。
rng = fg.GetCellRange(0, 5, 0, 8)
rng.Data = "South"
For i = 1 To 4
fg(1, i) = "Qtr " & i
fg(1, i + 4) = "Qtr " & i
Next
'' 列ヘッダを定義します。
fg.Cols(0).AllowMerging = True
'' 2つのセルをマージします。
rng = fg.GetCellRange(0, 0, 1, 0)
'' セルの書式とサイズを設定します。
fg.Styles.Fixed.TextAlign = TextAlignEnum.CenterCenter
fg.AutoSizeCols(1, fg.Cols.Count - 1, 10)
''オーナー描画を指定します。
fg.DrawMode = DrawModeEnum.OwnerDraw
''マージセルの幅を保存しておきます。
mWidth1 = fg.Cols(1).Width + fg.Cols(2).Width + _
fg.Cols(3).Width + fg.Cols(4).Width
mWidth2 = fg.Cols(5).Width + fg.Cols(6).Width + _
fg.Cols(7).Width + fg.Cols(8).Width
End Sub
Private Sub fg_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles fg.OwnerDrawCell
If e.Row = 0 And e.Col >= 1 Then
''マージセルかどうかを判断します。
Dim rng As CellRange = fg.GetMergedRange(e.Row, e.Col)
If rng.IsSingleCell = False Then
''テキストの描画方法、ブラシを指定します。
Dim strformat As StringFormat = New StringFormat()
strformat.Alignment = StringAlignment.Center
strformat.LineAlignment = StringAlignment.Center
Dim brushText As SolidBrush = New SolidBrush(Color.Red)
'' Rectangleオブジェクトを取得します。
Dim rct As Rectangle = fg.GetCellRect(0, 1, False)
Dim rct2 As Rectangle = fg.GetCellRect(0, 5, False)
''マージセル"North"を処理します
If e.Col = 1 Then
''マージセルのテキスト以外を描画します。
e.Text = ""
e.DrawCell()
''非表示領域も含めたRectangleオブジェクトを作成します。
Dim r As RectangleF = _
New RectangleF(fg.Cols(0).WidthDisplay + _
fg.ScrollPosition.X, _
rct.Y, mWidth1, rct.Height)
''マージセルのテキストを描画します。
e.Graphics.DrawString("North", Me.Font, _
brushText, r, strformat)
End If
''マージセル"South"も同様に処理します。
If e.Col = 5 Then
e.Text = ""
e.DrawCell()
Dim r2 As RectangleF = _
New RectangleF(fg.Cols(0).WidthDisplay + _
mWidth1 + fg.ScrollPosition.X, _
rct2.Y, mWidth2, rct2.Height)
e.Graphics.DrawString("South", Me.Font, _
brushText, r2, strformat)
End If
e.Handled = True
End If
End If
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i
'' コントロールを初期化します。
fg.Styles.Normal.WordWrap = True
fg.Cols.Count = 9
fg.Rows.Fixed = 2
fg.AllowMerging = AllowMergingEnum.FixedOnly
'' 行ヘッダを定義します。
fg.Rows(0).AllowMerging = True
'' 4つのセルをマージします。
Dim rng As CellRange = fg.GetCellRange(0, 1, 0, 4)
rng.Data = "North"
'' 4つのセルをマージします。
rng = fg.GetCellRange(0, 5, 0, 8)
rng.Data = "South"
For i = 1 To 4
fg(1, i) = "Qtr " & i
fg(1, i + 4) = "Qtr " & i
Next
'' 列ヘッダを定義します。
fg.Cols(0).AllowMerging = True
'' 2つのセルをマージします。
rng = fg.GetCellRange(0, 0, 1, 0)
'' セルの書式とサイズを設定します。
fg.Styles.Fixed.TextAlign = TextAlignEnum.CenterCenter
fg.AutoSizeCols(1, fg.Cols.Count - 1, 10)
''オーナー描画を指定します。
fg.DrawMode = DrawModeEnum.OwnerDraw
''マージセルの幅を保存しておきます。
mWidth1 = fg.Cols(1).Width + fg.Cols(2).Width + _
fg.Cols(3).Width + fg.Cols(4).Width
mWidth2 = fg.Cols(5).Width + fg.Cols(6).Width + _
fg.Cols(7).Width + fg.Cols(8).Width
End Sub
Private Sub fg_OwnerDrawCell(ByVal sender As Object, ByVal e As C1.Win.C1FlexGrid.OwnerDrawCellEventArgs) Handles fg.OwnerDrawCell
If e.Row = 0 And e.Col >= 1 Then
''マージセルかどうかを判断します。
Dim rng As CellRange = fg.GetMergedRange(e.Row, e.Col)
If rng.IsSingleCell = False Then
''テキストの描画方法、ブラシを指定します。
Dim strformat As StringFormat = New StringFormat()
strformat.Alignment = StringAlignment.Center
strformat.LineAlignment = StringAlignment.Center
Dim brushText As SolidBrush = New SolidBrush(Color.Red)
'' Rectangleオブジェクトを取得します。
Dim rct As Rectangle = fg.GetCellRect(0, 1, False)
Dim rct2 As Rectangle = fg.GetCellRect(0, 5, False)
''マージセル"North"を処理します
If e.Col = 1 Then
''マージセルのテキスト以外を描画します。
e.Text = ""
e.DrawCell()
''非表示領域も含めたRectangleオブジェクトを作成します。
Dim r As RectangleF = _
New RectangleF(fg.Cols(0).WidthDisplay + _
fg.ScrollPosition.X, _
rct.Y, mWidth1, rct.Height)
''マージセルのテキストを描画します。
e.Graphics.DrawString("North", Me.Font, _
brushText, r, strformat)
End If
''マージセル"South"も同様に処理します。
If e.Col = 5 Then
e.Text = ""
e.DrawCell()
Dim r2 As RectangleF = _
New RectangleF(fg.Cols(0).WidthDisplay + _
mWidth1 + fg.ScrollPosition.X, _
rct2.Y, mWidth2, rct2.Height)
e.Graphics.DrawString("South", Me.Font, _
brushText, r2, strformat)
End If
e.Handled = True
End If
End If
End Sub
◎サンプルコード(C#)
public int mWidth1, mWidth2;
private void Form1_Load(object sender, EventArgs e)
{
int i;
// コントロールを初期化します。
fg.Styles.Normal.WordWrap = true;
fg.Styles.Normal.WordWrap = true;
fg.Cols.Count = 9;
fg.Rows.Fixed = 2;
fg.AllowMerging = AllowMergingEnum.FixedOnly;
// 行ヘッダを定義します。
fg.Rows[0].AllowMerging = true;
// 4つのセルをマージします。
CellRange rng = fg.GetCellRange(0, 1, 0, 4);
rng.Data = "North";
// 4つのセルをマージします。
rng = fg.GetCellRange(0, 5, 0, 8);
rng.Data = "South";
for (i = 1; i < 5; i++)
{
fg[1, i] = "Qtr " + i;
fg[1, i + 4] = "Qtr " + i;
}
// 列ヘッダを定義します。
fg.Cols[0].AllowMerging = true;
// 2つのセルをマージします。
rng = fg.GetCellRange(0, 0, 1, 0);
// セルの書式とサイズを設定します。
fg.Styles.Fixed.TextAlign = TextAlignEnum.CenterCenter;
fg.AutoSizeCols(1, fg.Cols.Count - 1, 10);
//オーナー描画を指定します。
fg.DrawMode = DrawModeEnum.OwnerDraw;
//マージセルの幅を保存しておきます。
mWidth1 = fg.Cols[1].Width + fg.Cols[2].Width +
fg.Cols[3].Width + fg.Cols[4].Width;
mWidth2 = fg.Cols[5].Width + fg.Cols[6].Width +
fg.Cols[7].Width + fg.Cols[8].Width;
}
private void fg_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
{
if ((e.Row == 0) && (e.Col >= 1))
{
//マージセルかどうかを判断します。
CellRange rng = fg.GetMergedRange(e.Row, e.Col);
if (rng.IsSingleCell == false)
{
//テキストの描画方法、ブラシを指定します。
StringFormat strformat = new StringFormat();
strformat.Alignment = StringAlignment.Center;
strformat.LineAlignment = StringAlignment.Center;
SolidBrush brushText = new SolidBrush(Color.Red);
// Rectangleオブジェクトを取得します。
Rectangle rct = fg.GetCellRect(0, 1, false);
Rectangle rct2 = fg.GetCellRect(0, 5, false);
//マージセル"North"を処理します。
if (e.Col == 1)
{
//マージセルのテキスト以外を描画します。
e.Text = "";
e.DrawCell();
//非表示領域も含めたRectangleオブジェクトを作成します。
RectangleF r =
new RectangleF(fg.Cols[0].WidthDisplay +
fg.ScrollPosition.X,
rct.Y, mWidth1, rct.Height);
//マージセルのテキストを描画します。
e.Graphics.DrawString("North", this.Font, brushText, r, strformat);
}
//マージセル"South"も同様に処理します。
if (e.Col == 5)
{
e.Text = "";
e.DrawCell();
RectangleF r2 =
new RectangleF(fg.Cols[0].WidthDisplay +
mWidth1 + fg.ScrollPosition.X,
rct2.Y, mWidth2, rct2.Height);
e.Graphics.DrawString("South", this.Font, brushText, r2, strformat);
}
e.Handled = true;
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
int i;
// コントロールを初期化します。
fg.Styles.Normal.WordWrap = true;
fg.Styles.Normal.WordWrap = true;
fg.Cols.Count = 9;
fg.Rows.Fixed = 2;
fg.AllowMerging = AllowMergingEnum.FixedOnly;
// 行ヘッダを定義します。
fg.Rows[0].AllowMerging = true;
// 4つのセルをマージします。
CellRange rng = fg.GetCellRange(0, 1, 0, 4);
rng.Data = "North";
// 4つのセルをマージします。
rng = fg.GetCellRange(0, 5, 0, 8);
rng.Data = "South";
for (i = 1; i < 5; i++)
{
fg[1, i] = "Qtr " + i;
fg[1, i + 4] = "Qtr " + i;
}
// 列ヘッダを定義します。
fg.Cols[0].AllowMerging = true;
// 2つのセルをマージします。
rng = fg.GetCellRange(0, 0, 1, 0);
// セルの書式とサイズを設定します。
fg.Styles.Fixed.TextAlign = TextAlignEnum.CenterCenter;
fg.AutoSizeCols(1, fg.Cols.Count - 1, 10);
//オーナー描画を指定します。
fg.DrawMode = DrawModeEnum.OwnerDraw;
//マージセルの幅を保存しておきます。
mWidth1 = fg.Cols[1].Width + fg.Cols[2].Width +
fg.Cols[3].Width + fg.Cols[4].Width;
mWidth2 = fg.Cols[5].Width + fg.Cols[6].Width +
fg.Cols[7].Width + fg.Cols[8].Width;
}
private void fg_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
{
if ((e.Row == 0) && (e.Col >= 1))
{
//マージセルかどうかを判断します。
CellRange rng = fg.GetMergedRange(e.Row, e.Col);
if (rng.IsSingleCell == false)
{
//テキストの描画方法、ブラシを指定します。
StringFormat strformat = new StringFormat();
strformat.Alignment = StringAlignment.Center;
strformat.LineAlignment = StringAlignment.Center;
SolidBrush brushText = new SolidBrush(Color.Red);
// Rectangleオブジェクトを取得します。
Rectangle rct = fg.GetCellRect(0, 1, false);
Rectangle rct2 = fg.GetCellRect(0, 5, false);
//マージセル"North"を処理します。
if (e.Col == 1)
{
//マージセルのテキスト以外を描画します。
e.Text = "";
e.DrawCell();
//非表示領域も含めたRectangleオブジェクトを作成します。
RectangleF r =
new RectangleF(fg.Cols[0].WidthDisplay +
fg.ScrollPosition.X,
rct.Y, mWidth1, rct.Height);
//マージセルのテキストを描画します。
e.Graphics.DrawString("North", this.Font, brushText, r, strformat);
}
//マージセル"South"も同様に処理します。
if (e.Col == 5)
{
e.Text = "";
e.DrawCell();
RectangleF r2 =
new RectangleF(fg.Cols[0].WidthDisplay +
mWidth1 + fg.ScrollPosition.X,
rct2.Y, mWidth2, rct2.Height);
e.Graphics.DrawString("South", this.Font, brushText, r2, strformat);
}
e.Handled = true;
}
}
}
旧文書番号
70000