PowerTools MultiRow for Windows Forms 8.0J
CellPainting イベント
使用例 

セルの描画が必要になると発生します。
構文
イベント データ

イベント ハンドラが、このイベントに関連するデータを含む、CellPaintingEventArgs 型の引数を受け取りました。次の CellPaintingEventArgs プロパティには、このイベントの固有の情報が記載されます。

プロパティ解説
CellBoundsこのセルの境界を取得します。  
CellIndexSection内でのセルのインデックスを取得します。  
CellNameセルの名前を取得します。  
CellStyle描画されるCellの表示スタイルを取得します。  
ClipBounds現在の描画Cellのクリッピング境界を取得します。  
Enabledこのセルが有効かどうかを示す値を取得します。  
ErrorIconこのセルのエラーアイコンを取得します。  
ErrorIconAlignmentセルに関連付けられたエラーアイコンの配置を取得します。  
ErrorTextセルで発生したエラーを示すエラーテキストを取得します。  
FormattedValue現在のセルの書式設定された値を取得します。  
Graphicsセルの描画に使用されたグラフィックを取得します。  
Handled System.ComponentModel.HandledEventArgsから継承されます。
IsPrintingこのセルが印刷中かどうかを示す値を取得します。  
RowIndexイベントが発生したオーナーRowのインデックスを取得します。  
Scopeイベントが発生したセルの領域を取得します。  
SectionIndexイベントが発生したオーナーSectionのインデックスを取得します。  
Selected指定されたCellが選択されているかどうかを示す値を取得します。  
Valueセルの値を取得します。  
ZoomFactor現在のGcMultiRowコントロールのズーム倍率を取得します。  
解説

ユーザーはこのイベントを処理して、コントロール内のセルの外観をカスタマイズできます。セル全体を独自に描画できるほか、セルの特定の部分を描画し、残りの部分の描画にCellPaintingEventArgs.PaintBackgroundCellPaintingEventArgs.PaintForegroundCellPaintingEventArgs.PaintErrorIconCellPaintingEventArgs.PaintBorderの各メソッドを使用することもできます。

このイベントを処理するときは、セルに直接アクセスするのではなく、イベントハンドラのパラメーターを通じてセルにアクセスしてください。

描画結果はPrintStyle.Richスタイルの印刷で出力できますが、PrintStyle.Compactスタイルの印刷では出力できません。

使用例
次のサンプルコードは、セルまたはセクションの描画ロジックをカスタマイズする方法を示します。
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace GrapeCity.Win.MultiRow.SampleCode
{
    class OwnerDrawDemo : Form
    {
        GcMultiRow gcMultiRow = new GcMultiRow();

        public OwnerDrawDemo()
        {
            this.Text = "Owner Draw Demo";

            gcMultiRow.Dock = DockStyle.Fill;

            LabelCell labelCell = new LabelCell();
            NumericUpDownCell editNumber = new NumericUpDownCell();
            editNumber.Size = new Size(150, 21);
            editNumber.Maximum = 100;
            editNumber.Minimum = 0;

            gcMultiRow.Template = Template.CreateGridTemplate(new Cell[] { labelCell, editNumber });

            gcMultiRow.Rows.Add("Value:", 30m);
            gcMultiRow.Rows.Add("Value:", 60m);
            gcMultiRow.Rows.Add("Value:", 45m);
            gcMultiRow.Rows.Add("Value:", 90m);

            gcMultiRow.CellPainting += new EventHandler<CellPaintingEventArgs>(gcMultiRow_CellPainting);

            gcMultiRow.SectionPainting += new EventHandler<SectionPaintingEventArgs>(gcMultiRow_SectionPainting);

            this.Controls.Add(gcMultiRow);
        }

        void gcMultiRow_CellPainting(object sender, CellPaintingEventArgs e)
        {
            if (e.CellIndex == 1 && e.Scope == CellScope.Row)
            {
                e.PaintBackground(e.ClipBounds);

                PaintRateBlock(e);

                e.PaintForeground(e.ClipBounds);

                e.PaintBorder(e.ClipBounds);

                // If you customize the paint logic, make sure, the Handled property should be set to true.
                e.Handled = true;
            }
        }
        private static void PaintRateBlock(CellPaintingEventArgs e)
        {
            Color color1 = Color.Red;
            Color color2 = Color.Orange;
            if (e.Selected)
            {
                color1 = Color.Blue;
                color2 = Color.SkyBlue;
            }

            decimal rate = 0m;

            if (e.Value != null)
            {
                rate = (decimal)(e.Value) / 100m;
            }

            // Calculate block size.
            int spinButtonWidth = 17;
            int blockWidth = (int)((e.ClipBounds.Width - spinButtonWidth) * rate);

            if (blockWidth > 0)
            {
                Rectangle rect = e.CellBounds;

                rect.Width = blockWidth;

                LinearGradientBrush brush = new LinearGradientBrush(rect, color1, color2, LinearGradientMode.Vertical);

                e.Graphics.FillRectangle(brush, rect);
            }
        }

        void gcMultiRow_SectionPainting(object sender, SectionPaintingEventArgs e)
        {
            if (e.RowIndex == this.gcMultiRow.NewRowIndex && e.Scope == CellScope.Row)
            {
                e.Paint(e.ClipBounds);

                StringFormat sf = new StringFormat();
                sf.Alignment = StringAlignment.Center;

                // Paint string in section face.
                e.Graphics.DrawString("Edit cell in this row to add new rows", gcMultiRow.Font, Brushes.Gray, e.SectionBounds, sf);

                // If you customize the paint logic, make sure, the Handled property should be set to true.
                e.Handled = true;
            }
        }

        [STAThreadAttribute()]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new OwnerDrawDemo());
        }
    }
}
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports GrapeCity.Win.MultiRow

Class OwnerDrawDemo
    Inherits Form
    Friend WithEvents gcMultiRow As New GcMultiRow()

    Public Sub New()
        Me.Text = "Owner Draw Demo"

        gcMultiRow.Dock = DockStyle.Fill

        Dim labelCell As New LabelCell()
        Dim editNumber As New NumericUpDownCell()
        editNumber.Size = New Size(150, 21)
        editNumber.Maximum = 100D
        editNumber.Minimum = 0

        gcMultiRow.Template = Template.CreateGridTemplate(New Cell() {labelCell, editNumber})

        gcMultiRow.Rows.Add("Value:", 30D)
        gcMultiRow.Rows.Add("Value:", 60D)
        gcMultiRow.Rows.Add("Value:", 45D)
        gcMultiRow.Rows.Add("Value:", 90D)

        Me.Controls.Add(gcMultiRow)
    End Sub

    Private Sub gcMultiRow_CellPainting(ByVal sender As Object, ByVal e As CellPaintingEventArgs) Handles gcMultiRow.CellPainting
        If e.CellIndex = 1 AndAlso e.Scope = CellScope.Row Then
            e.PaintBackground(e.ClipBounds)

            PaintRateBlock(e)

            e.PaintForeground(e.ClipBounds)

            e.PaintBorder(e.ClipBounds)

            ' If you customize the paint logic, make sure, the Handled property should be set to true.
            e.Handled = True
        End If
    End Sub
    Private Shared Sub PaintRateBlock(ByVal e As CellPaintingEventArgs)
        Dim color1 As Color = Color.Red
        Dim color2 As Color = Color.Orange
        If e.Selected Then
            color1 = Color.Blue
            color2 = Color.SkyBlue
        End If

        Dim rate As Decimal = 0D

        If e.Value <> Nothing Then
            rate = DirectCast((e.Value), Decimal) / 100D
        End If

        ' Calculate block size.
        Dim spinButtonWidth As Integer = 17
        Dim blockWidth As Integer = CInt((e.ClipBounds.Width - spinButtonWidth) * rate)

        If blockWidth > 0 Then
            Dim rect As Rectangle = e.CellBounds

            rect.Width = blockWidth

            Dim brush As New LinearGradientBrush(rect, color1, color2, LinearGradientMode.Vertical)

            e.Graphics.FillRectangle(brush, rect)
        End If
    End Sub

    Private Sub gcMultiRow_SectionPainting(ByVal sender As Object, ByVal e As SectionPaintingEventArgs) Handles gcMultiRow.SectionPainting
        If e.RowIndex = Me.gcMultiRow.NewRowIndex AndAlso e.Scope = CellScope.Row Then
            e.Paint(e.ClipBounds)

            Dim sf As New StringFormat()
            sf.Alignment = StringAlignment.Center

            ' Paint string in section face.
            e.Graphics.DrawString("Edit cell in this row to add new rows", gcMultiRow.Font, Brushes.Gray, e.SectionBounds, sf)

            ' If you customize the paint logic, make sure, the Handled property should be set to true.
            e.Handled = True
        End If
    End Sub

    <STAThreadAttribute()> _
    Public Shared Sub Main()
        Application.EnableVisualStyles()
        Application.Run(New OwnerDrawDemo())
    End Sub
End Class
参照

GcMultiRow クラス
GcMultiRow メンバ

 

 


© 2008-2015 GrapeCity inc. All rights reserved.