PowerTools MultiRow for Windows Forms 8.0J
値がnullのときの代替文字列

DateTimePickerCellの値がnull(Visual BasicではNothing)のときに代替文字列を表示するには、セルの継承またはオーナー描画を行います。
DateTimePickerCellを継承してユーザー定義型セルを作成する場合
次のコードはDateTimePickerCellを継承するユーザー定義セルMyDateTimePickerCellです。

Imports System.Windows.Forms
Imports GrapeCity.Win.MultiRow

Public Class MyDateTimePickerCell
     Inherits DateTimePickerCell

    Protected Overrides Sub OnPaint(ByVal e As CellPaintingEventArgs)
         MyBase.OnPaint(e)
        If e.Value Is Nothing Then
            Dim placeHolder As String = "(なし)"
            e.PaintBackground(e.ClipBounds)
            Dim brushColor As Color = IIf(e.Selected, e.CellStyle.SelectionForeColor, e.CellStyle.ForeColor)
            If e.Enabled = False Then brushColor = e.CellStyle.DisabledForeColor
            Using brush As New SolidBrush(brushColor)
                Dim contentSize As SizeF = e.Graphics.MeasureString(placeHolder, e.CellStyle.Font)
                Dim y As Double = e.CellBounds.Y + ((e.CellBounds.Height - contentSize.Height) / 2)
                e.Graphics.DrawString(placeHolder, e.CellStyle.Font, brush, e.ClipBounds.X, y)
            End Using
         End If
    End Sub

End Class
using System.Drawing;
using GrapeCity.Win.MultiRow;

public class MyDateTimePickerCell : DateTimePickerCell
{

    protected override void OnPaint(CellPaintingEventArgs e)
    {
         base.OnPaint(e);
        if (e.Value != null)
        {
            string placeHolder = "(なし)";
            Color brushColor = e.Selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor;
            if (e.Enabled == false)
                brushColor = e.CellStyle.DisabledForeColor;

            using (Brush brush = new SolidBrush(brushColor))
            {
                SizeF contentSize = e.Graphics.MeasureString(placeHolder, e.CellStyle.Font);
                 float y = e.CellBounds.Y + ((e.CellBounds.Height - contentSize.ToSize().Height) / 2);
                 e.Graphics.DrawString(placeHolder, e.CellStyle.Font, brush, e.CellBounds.X, y);
            }
        }
    }
}

デザイナでこのセルを使用するには、次のように操作します。

  1. 上記のコードをMyDateTimePickerCell.vbまたはMyDateTimePickerCell.csとしてファイルに保存する。
  2. ファイルをプロジェクトに追加する。
  3. プロジェクトをビルドする。
  4. テンプレートデザイナを開く。
  5. ツールボックスから"MyDateTimePickerCell"を選択し、ドラッグしてデザイナに配置する。
DateTimePickerCellを継承してユーザー定義型セルを作成する場合
Imports GrapeCity.Win.MultiRow

Private Sub GcMultiRow1_CellPainting(ByVal sender As System.Object, ByVal e As CellPaintingEventArgs) Handles GcMultiRow1.CellPainting
    Dim gcMultiRow As GcMultiRow = TryCast(sender, GcMultiRow)
    If TypeOf gcMultiRow.Rows(e.RowIndex).Cells(e.CellIndex) Is DateTimePickerCell Then
        If e.Value Is Nothing Then
            Dim placeHolder As String = "(なし)"
            e.PaintBackground(e.ClipBounds)
            Dim brushColor As Color = IIf(e.Selected, e.CellStyle.SelectionForeColor, e.CellStyle.ForeColor)
            Using brush As New SolidBrush(brushColor)
                Dim contentSize As SizeF = e.Graphics.MeasureString(placeHolder, e.CellStyle.Font)
                Dim y As Double = e.CellBounds.Y + ((e.CellBounds.Height - contentSize.Height) / 2)
                e.Graphics.DrawString(placeHolder, e.CellStyle.Font, brush, e.ClipBounds.X, y)
            End Using
             e.PaintErrorIcon(e.ClipBounds)
            e.PaintWaveLine(e.ClipBounds)
            e.PaintBorder(e.ClipBounds)

            e.Handled = True
         End If
    End If
End Sub
using GrapeCity.Win.MultiRow;

private void gcMultiRow1_CellPainting(object sender, GrapeCity.Win.MultiRow.CellPaintingEventArgs e)
{
    GcMultiRow gcMultiRow = sender as GcMultiRow;
    if (gcMultiRow.Rows[e.RowIndex].Cells[e.CellIndex] is DateTimePickerCell)
    {
        if (e.Value == null)
        {
            string placeHolder = "(なし)";
            e.PaintBackground(e.ClipBounds);
            Color brushColor = e.Selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor;
            using (Brush brush = new SolidBrush(brushColor))
            {
                SizeF contentSize = e.Graphics.MeasureString(placeHolder, e.CellStyle.Font);
                 float y = e.CellBounds.Y + ((e.CellBounds.Height - contentSize.ToSize().Height) / 2);
                 e.Graphics.DrawString(placeHolder, e.CellStyle.Font, brush, e.CellBounds.X, y);
            }
            e.PaintErrorIcon(e.ClipBounds);
            e.PaintWaveLine(e.ClipBounds);
             e.PaintBorder(e.ClipBounds);

            e.Handled = true;
        }
    }
}

GcMultiRowコントロールでオーナー描画する場合はセルのドロップダウンボタンを予め描画することができないため、独自に描画処理を追加する必要があります。
   
参照

 

 


© 2008-2015 GrapeCity inc. All rights reserved.