【セル型】InputMan Web の Dateコントロールを使用したい

文書番号 : 21855     文書種別 : 使用方法     最終更新日 : 2007/03/15
文書を印刷する
対象製品
SPREAD for .NET 2.5J Web Forms Edition
詳細
既存のセル型クラスを継承するカスタム型セルを作成することで可能です。
SPREADではPaintCellメソッドでセル上に表示するコントロールを設定します。カスタム型セルではこのPaintCellメソッドにてDateコントロールを設定します。

  メモメモ
  • 既存クラスの継承は.NETアプリケーション開発における一般的な手法です。継承方法の詳細についてはMSDNライブラリをご参照ください。(既存クラスのカスタマイズ方法については弊社サポートサービス対象外となります)

下記サンプルコードです。
新規WebフォームにSPREAD、Dateコントロールを配置した状態でコードをコピーし、動作を確認して下さい。
 ※新規WebフォームにDateコントロールを配置することでプロジェクトに必要な参照設定が追加されます。
   このコントロールは1度目のデバッグ以降、削除して下さい。
 ※サンプルコードは次の製品にて動作確認を行いました。
   - SPREAD .NET 2.5J Web Ed. Ver 2.5.1004.2002
   - InputMan .NET 1.0J Web Ed. Ver 1.0.2006.1208
           および
   - SPREAD .NET 2.5J Web Ed. Ver 2.5.2004.2005     
   - InputMan .NET 2.0J Web Ed. Ver 2.0.2007.207

【VB サンプルコード】
-------------------------------------
Webフォームクラス
-------------------------------------
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim i As String
    Dim j As Integer
    Dim COLDATE As Int32 = 1 '日付列の列番号

    If IsPostBack Then
      ' ポストバック時にDateコントロールのデータを確認します
      For j = 0 To FpSpread1.Sheets(0).RowCount - 1
        i = Page.Request.Form(FpSpread1.ID & "_mydate" & CStr(j) & "_" & CStr(COLDATE) & "_EditField")
        FpSpread1.Sheets(0).Cells(j, 1).Value = i
      Next
      Return
    End If

    FpSpread1.Sheets(0).Columns(1).CellType = New MyDateTypeCell
    FpSpread1.Sheets(0).Columns(1).Width = 160
  End Sub

-------------------------------------
カスタム型セルクラス
-------------------------------------
Imports FarPoint.Web.Spread

<Serializable()> Public Class MyDateTypeCell
  Inherits GeneralCellType

  Public Overrides Function PaintCell(ByVal id As String, ByVal parent As System.Web.UI.WebControls.TableCell, ByVal style As FarPoint.Web.Spread.Appearance, ByVal margin As FarPoint.Web.Spread.Inset, ByVal value As Object, ByVal upperLevel As Boolean) As System.Web.UI.Control

    'SPREADセルの編集をキャンセル
    parent.Attributes.Add("FpCellType", "readonly")

    Dim mydate As New GrapeCity.Web.Input.IMDate.Date
    mydate.TabIndex = -1
    mydate.DisplayFormat.Pattern = "ggg ee年 MM月 dd日"
    mydate.Format.Pattern = "ggg ee年 MM月 dd日"

    If Not (value Is Nothing) Then
      mydate.Value = New GrapeCity.Web.Input.Core.DateTimeEx(Date.Parse(Cstr(value)))
    End If
    mydate.ID = "mydate" & id.Replace(",", "_")
    mydate.ClientEvents.DropDownOpen = "mydate_dopen"
    mydate.ClientEvents.DropDownClose = "mydate_dclose"

    Return mydate

  End Function

End Class
-------------------------------------
クライアント側スクリプト
-------------------------------------
  <script type="text/javascript">
     var COLDATE=1//日付列の列番号;
     var flag_open = true;//フラグ(カレンダー開閉)
   
     function window.onload(){
      var s=document.getElementById("FpSpread1");
      s.onkeydown=skeyd;
      s.onActiveCellChanged=ac;
      s.onmouseup=mu;
     }
     function mydate_dclose(oDate, eArgs){
      if(flag_open)
      {          
        oDate.SetDroppedDown(true);
        flag_open = false;
      }
     }
     function mydate_dopen(oDate, eArgs){
      flag_open = true;
     } 
     function skeyd(){
      //SPREADのキー入力をキャンセル
      var s=document.getElementById("FpSpread1");
      if(s.ActiveCol!=COLDATE)return;
      if(event.keyCode!=9)//[Tab]キー以外キャンセル
        event.cancelBubble=true;
     }
     function ac(){
      //InputMan Dateにフォーカスを移動
      if(event.Col!=COLDATE)return;
      var s=document.getElementById("FpSpread1");
      var d=FindIMControl(s.id+"_mydate"+event.Row+"_"+event.Col);
      d.SetFocus();
     }
     function mu(){
      //InputMan Dateにフォーカスを移動
      var s=document.getElementById("FpSpread1");
      if(s.ActiveCol!=COLDATE)return;   
      var d=FindIMControl(s.id+"_mydate"+s.ActiveRow+"_"+s.ActiveCol);
      d.SetFocus();
     }
   </script>


【C# サンプルコード】
-------------------------------------
Webフォームクラス
-------------------------------------
     private void Page_Load(object sender, System.EventArgs e)
     {
      string i;
      int COLDATE =1;//日付列の列番号

      if(IsPostBack)
      {
        //ポストバック時にDateコントロールのデータを確認します
        for(int j=0;j<FpSpread1.Sheets[0].RowCount;j++)
        {
          i=Request.Form[FpSpread1.ID+"_mydate"+Convert.ToString(j)+"_"+Convert.ToString(COLDATE) + "_EditField"];
          FpSpread1.Sheets[0].Cells[j,1].Value=i;
        }
        return;
      }
      FpSpread1.Sheets[0].Columns[1].CellType = new MyDateTypeCell();
      FpSpread1.Sheets[0].Columns[1].Width = 160;
     }

-------------------------------------
カスタム型セルクラス
-------------------------------------
using FarPoint.Web.Spread;
[Serializable()]
public class MyDateTypeCell : GeneralCellType
{
  public override Control PaintCell(string id, TableCell parent, Appearance style, Inset margin, object value, bool upperLevel)
  {    
    GrapeCity.Web.Input.IMDate.Date mydate = new GrapeCity.Web.Input.IMDate.Date();
    mydate.DisplayFormat.Pattern = "ggg ee年 MM月 dd日";
    mydate.Format.Pattern = "ggg ee年 MM月 dd日";

    if (value != null)
      mydate.Value = new GrapeCity.Web.Input.Core.DateTimeEx(DateTime.Parse(Convert.ToString(value)));
    mydate.ID = "mydate" + id.Replace(",", "_");
    mydate.ClientEvents.DropDownOpen = "mydate_dopen";
    mydate.ClientEvents.DropDownClose = "mydate_dclose";
       
    return mydate;
  }

}
-------------------------------------
クライアント側スクリプト
-------------------------------------
VB サンプルコードでご紹介しているものと同様です。
関連情報
キーワード
クライアント側スクリプト セル型

この文書は、以前は次のFAQ IDで公開されていました : 9179