MESCIUS SPREAD for Windows Forms 17.0J サンプルコード集
独自のセル型を作成する(既存セルクラスの継承)

既存のセル型を継承したサブクラスを作成する(各メソッドのオーバーライドなど)ことで独自の機能を実装することができます。ここではセルの編集エディタとして標準の「NumericUpDownコントロール」を利用し、PaintCellメソッドのオーバーライドによって非編集セル独自に描画しています。

【実行例】 編集中セルでのNumericUpDownコントロール表示

NumericUpDown表示時

非編集セルイメージ(グラデーション表示)

編集完了後イメージ

  • 既存クラスの継承は.NETアプリケーション開発における一般的な手法です。継承方法の詳細についてはMSDNライブラリをご参照ください。
  • 本サンプルは基本的な継承例です。実際にはプロジェクトの仕様に基づいた各カスタマイズが必要となります。
  • 独自のクラスを作成する場合、必ず全てのメソッドのオーバーライドが必要という訳ではありません。
    便宜上、下記のサンプルコードでは基本的な全てのメソッドをオーバーライドしていますが、例えば非編集セルの描画のみを独自に行いたい場合は、PaintCellメソッドだけをオーバーライドします。つまり、SPREADが提供する基本機能以外の処理を行いたい場合にのみ、必要に応じて各メソッドのオーバーライドが必要になるということです。
  • エディタコントロール(この場合はNumericUpDownコントロール)はセルが編集中の場合のみ表示されます。非編集セル(PaintCellメソッド)におけるコントロールの描画方法(DrawStringメソッドなど)についてはMSDNライブラリをご参照ください。
private void Form1_Load(object sender, EventArgs e)
{
    // 作成したカスタムクラスを設定
    fpSpread1.ActiveSheet.Cells[1, 1].CellType = new MyNumericCellType();
    fpSpread1.ActiveSheet.SetColumnWidth(1, 90);
    fpSpread1.ActiveSheet.SetRowHeight(1, 20);
    // テストデータの設定
    fpSpread1.ActiveSheet.Cells[1, 1].Value = "123";
}
Private Sub CellType_11_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    '作成したカスタムクラスを設定
    FpSpread1.ActiveSheet.Cells(1, 1).CellType = New MyNumericCellType
    FpSpread1.ActiveSheet.SetColumnWidth(1, 90)
    FpSpread1.ActiveSheet.SetRowHeight(1, 20)
    ' テストデータの設定
    FpSpread1.ActiveSheet.Cells(1, 1).Value = "123"
End Sub

カスタムセルクラス

[Serializable()] class MyNumericCellType : FarPoint.Win.Spread.CellType.GeneralCellType //標準型セルを継承します
{

 //(System.Windows.Forms)NumericUpDownコントロールのインスタンスを生成します
 NumericUpDown nud = new NumericUpDown();

 public MyNumericCellType() : base()
 {

  //NumericUpDownのプロパティを設定します
  nud.Maximum = 199;
  nud.Minimum = 1;

 }

 public MyNumericCellType(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context)
 {

  //NumericUpDownのプロパティを設定します
  nud.Maximum = 199;
  nud.Minimum = 1;

 }

 public override string Format(object o)
 {

  //ここでは継承元(標準型セル)のFormatメソッドをオーバーライドします
  return base.Format(o.ToString());

 }

 public override Control GetEditorControl(FarPoint.Win.Spread.Appearance appearance, float zoomFactor)
 {

  //編集中セルのエディタコントロールとしてNumericUpDownを返します
  return nud;

 }
 public override object GetEditorValue()
 {

  //エディタコントロールであるNumericUpDownのテキスト値を返します
  return nud.Text;

 }

 public override Size GetPreferredSize(Graphics g, Size size, FarPoint.Win.Spread.Appearance appr, object value, float zoom)
 {

  //ここでは継承元(標準型セル)のGetPreferredSizeメソッドをオーバーライドします
  return base.GetPreferredSize(g, size, appr, value, zoom);

 }

 public override void PaintCell(Graphics g, Rectangle r, FarPoint.Win.Spread.Appearance appr, object value, bool issel, bool islocked, float zoom)
 {

  Brush backColorBrush = new System.Drawing.Drawing2D.LinearGradientBrush(r, SystemColors.ControlLightLight, SystemColors.ControlDark, System.Drawing.Drawing2D.LinearGradientMode.Horizontal);
  Brush foreColorBrush = new SolidBrush(Color.RoyalBlue);

  StringFormat sf = new StringFormat();
  sf.Alignment = StringAlignment.Center;
  sf.LineAlignment = StringAlignment.Center;
  g.FillRectangle(backColorBrush, r);
  if (value is string)
  {
    //独自の文字列描画を行います(グラデーション表示)
    g.DrawString((string)value, new Font("Times New Roman", 12), foreColorBrush, new RectangleF(r.X, r.Y, r.Width, r.Height),sf);
  }

  backColorBrush.Dispose();
  foreColorBrush.Dispose();

 }

 public override object Parse(string s)
 {

  //ここでは継承元(標準型セル)のParseメソッドをオーバーライドします
  return base.Parse(s);

 }

 public override void SetEditorValue(object value)
 {

  //セルの編集中に利用されるNumericUpDownに値を設定します
  nud.Text = (string)value;

 }

}
 <Serializable()> Public Class MyNumericCellType

  '標準型セルを継承します
  Inherits FarPoint.Win.Spread.CellType.GeneralCellType

  '(System.Windows.Forms)NumericUpDownコントロールのインスタンスを生成します
  Private nud As New NumericUpDown

  Public Sub New()

   MyBase.New()
   'NumericUpDownのプロパティを設定します
   nud.Maximum = 199
   nud.Minimum = 1

  End Sub

  Public Sub New(ByVal info As System.Runtime.Serialization.SerializationInfo, ByVal context As System.Runtime.Serialization.StreamingContext)

   MyBase.New(info, context)
   'NumericUpDownのプロパティを設定します
   nud.Maximum = 199
   nud.Minimum = 1

  End Sub

  Public Overrides Function Format(ByVal obj As Object) As String

   'ここでは継承元(標準型セル)のFormatメソッドをオーバーライドします
   Return MyBase.Format(obj)

  End Function

  Public Overrides Function GetEditorControl(ByVal appearance As FarPoint.Win.Spread.Appearance, ByVal zoomFactor As Single) As System.Windows.Forms.Control

   '編集中セルのエディタコントロールとしてNumericUpDownを返します
   Return nud

  End Function

  Public Overrides Function GetEditorValue() As Object

   'エディタコントロールであるNumericUpDownのテキスト値を返します
   Return nud.Text

  End Function

  Public Overloads Overrides Function GetPreferredSize(ByVal g As System.Drawing.Graphics, ByVal size As System.Drawing.Size, ByVal appearance As FarPoint.Win.Spread.Appearance, ByVal value As Object, ByVal zoomFactor As Single) As System.Drawing.Size

   'ここでは継承元(標準型セル)のGetPreferredSizeメソッドをオーバーライドします
   Return MyBase.GetPreferredSize(g, size, appearance, value, zoomFactor)

  End Function

  Public Overrides Sub PaintCell(ByVal g As System.Drawing.Graphics, ByVal r As System.Drawing.Rectangle, ByVal appearance As FarPoint.Win.Spread.Appearance, ByVal value As Object, ByVal isSelected As Boolean, ByVal isLocked As Boolean, ByVal zoomFactor As Single)

   Dim backColorBrush As Brush = New System.Drawing.Drawing2D.LinearGradientBrush(r, SystemColors.ControlLightLight, SystemColors.ControlDark, System.Drawing.Drawing2D.LinearGradientMode.Horizontal)
   Dim foreColorBrush As Brush = New SolidBrush(Color.Red)
   Dim sf As New StringFormat

   sf.Alignment = StringAlignment.Center
   sf.LineAlignment = StringAlignment.Center
   g.FillRectangle(backColorBrush, r)

   If TypeOf value Is String Then
      '独自の文字列描画を行います(グラデーション表示)
      g.DrawString(CStr(value), New Font("Times New Roman", 12), foreColorBrush, New RectangleF(r.X, r.Y, r.Width, r.Height), sf)
   End If

   backColorBrush.Dispose()
   foreColorBrush.Dispose()

  End Sub

  Public Overrides Function Parse(ByVal s As String) As Object

   'ここでは継承元(標準型セル)のParseメソッドをオーバーライドします
   Return MyBase.Parse(s)

  End Function

  Public Overrides Sub SetEditorValue(ByVal value As Object)

   'セルの編集中に利用されるNumericUpDownに値を設定します
   nud.Text = value

  End Sub

 End Class

 

 


© MESCIUS inc. All rights reserved.