【セル型】セルに編集可能なリストを表示したい

文書番号 : 21814     文書種別 : 使用方法     最終更新日 : 2006/06/23
文書を印刷する
対象製品
SPREAD for .NET 2.5J Web Forms Edition
詳細
1つのセルに複数の独立したデータを編集可能な形式で表示したい場合、製品で提供されるセル型でこの機能を直接実現するものはありません。

ただ、既存のセル型を継承する独自のセル型を開発することで実現できます。下記ではセルの中に複数のテキストボックスを表示するカスタムセル型を作成しています。

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

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

    Dim lt As New MyListType
    FpSpread1.Sheets(0).Cells(0, 0).CellType = lt
    FpSpread1.Sheets(0).Cells(0, 0).Value = "曙,小錦,武蔵丸"
    FpSpread1.Sheets(0).DefaultRowHeight = FpSpread1.Sheets(0).DefaultRowHeight * 4
  End Sub

------------------------------------
 カスタムセル型クラス(MyListType)
------------------------------------
Public Class MyListType
  Inherits FarPoint.Web.Spread.GeneralCellType

  Private items As String()

  Public Sub New()
    items = Nothing
  End Sub

  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

    Dim str As String = Convert.ToString(value)
    items = str.Split(Convert.ToChar(","))

    Dim cell As TableCell
    Dim row As TableRow

    Dim table As New Table()

    Dim i As Integer
    For i = 0 To items.Length - 1
      cell = New TableCell()
      cell.Text = items(i)

      If upperLevel Then
        cell.Attributes.Add("isbox", "true")
        row = New TableRow()
        row.Cells.Add(cell)
        table.Rows.Add(row)
        cell.Font.Size = FontUnit.XSmall
        cell.Width = Unit.Percentage(100)
        row.Width = Unit.Percentage(100)
        table.Width = Unit.Percentage(100)
      End If

    Next

    Return table
  End Function

  Public Overrides ReadOnly Property EditorClientScriptUrl() As String
    Get
      Return "mylisteditor_7039.htc"
    End Get
  End Property

  Public Overrides ReadOnly Property RendererClientScriptUrl() As String
    Get
      Return "mylistrender_7039.htc"
    End Get
  End Property

  Public Overrides Function GetEditorControl(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
    Dim tb As TextBox
    Dim cell As TableCell
    Dim row As TableRow

    Dim table As New Table()

    Dim i As Integer
    For i = 0 To items.Length - 1
      items(i) = items(i).Trim()
      If Not (items(i) = Nothing) And Not (items(i) = "") Then
        tb = New TextBox()
        tb.Text = items(i)


        If upperLevel Then
          tb.Attributes.Add("isbox", "true")
        End If

        cell = New TableCell()
        cell.Controls.Add(tb)
        row = New TableRow()
        row.Cells.Add(cell)
        table.Rows.Add(row)

        tb.Width = Unit.Percentage(100)
        cell.Width = Unit.Percentage(100)
        row.Width = Unit.Percentage(100)
        table.Width = Unit.Percentage(100)
      End If

    Next

    Return table
  End Function

End Class

-----------------------------------------------
   mylisteditor.htc
-----------------------------------------------
<PUBLIC:COMPONENT>
<PUBLIC:PROPERTY NAME="value">
 <get internalName="getValue"/>
 <!--<put internalName="setValue"/>-->
</PUBLIC:PROPERTY>
<PUBLIC:METHOD NAME="isValid">
</PUBLIC:METHOD>
<PUBLIC:ATTACH EVENT="ondocumentready" ONEVENT="init()" />
</PUBLIC:COMPONENT>

<script language="javascript">
        
  var items=new Array();
  function init() {
   var count=element.all.length;
   var j=0;
   for(var i=0;i<count;i++){
    if(element.all[i].isbox=="true"){
     items[j]=element.all[i];
     j++;
    }
    }     
  }
  
  function getValue() {

   var ret="";
   for(var i=0;i<items.length;i++){
    if(items[i]!=null||items[i]!=""){
     if(i==items.length-1)
      ret+=items[i].value;
     else
      ret+=items[i].value+",";
     }
    } 
   return ret;
   }
   
  
  function isValid(val) {   
   return "";
  }
       
</script>

------------------------------------------------
  mylistrender.htc
------------------------------------------------
<PUBLIC:COMPONENT>
<PUBLIC:PROPERTY NAME="value">
 <!--<get internalName="getValue"/>-->
 <put internalName="setValue"/>
</PUBLIC:PROPERTY>
</PUBLIC:COMPONENT>

<script language=javascript>
 var items=new Array();

 function setValue(val){

 if(val!=null && val!=""){
  items=val.split(',');

  var count=element.all.length;
  var j=0;
  for(var i=0;i<count;i++){
   if(element.all[i].isbox=="true"){
    element.all[i].innerText=items[j];
    j++;
   } 
  }

}
}
</script>

【C# サンプルコード】
------------------------
 Webフォームクラス
------------------------
private void Page_Load(object sender, System.EventArgs e)
{
 if (IsPostBack)
 {
   return;
 }

 MyListType lt=new MyListType();
 FpSpread1.Sheets[0].Cells[0,0].CellType=lt;
 FpSpread1.Sheets[0].Cells[0,0].Value="曙,小錦,武蔵丸";

 FpSpread1.Sheets[0].DefaultRowHeight=FpSpread1.Sheets[0].DefaultRowHeight*4;

}

------------------------------------
 カスタムセル型クラス(MyListType)
------------------------------------
  [Serializable()]
  public class MyListType:GeneralCellType
  {
    private string[] items;
    public MyListType()
    {
    items=null;
    }
    public override System.Web.UI.Control PaintCell(string id, System.Web.UI.WebControls.TableCell parent, Appearance style, Inset margin, object value, bool upperLevel)
    {
      string str=Convert.ToString(value);
      items=str.Split(',');

      TableCell cell;
      TableRow row;
      Table table=new Table();

      for(int i=0;i<items.Length;i++)
      {

        cell=new TableCell();
        cell.Text=items[i];
        if(upperLevel)
        cell.Attributes.Add("isbox","true");
        row=new TableRow();
        row.Cells.Add(cell);
        table.Rows.Add(row);

        cell.Font.Size=FontUnit.XSmall;
        cell.Width=Unit.Percentage(100);
        row.Width=Unit.Percentage(100);
        table.Width=Unit.Percentage(100);
      }
      return table;
    }
    public override string EditorClientScriptUrl
    {
      get
      {
         return "mylisteditor.htc";
      }
    }
    public override string RendererClientScriptUrl
    {
      get
      {
         return "mylistrender.htc";
      }
    }
    public override System.Web.UI.Control GetEditorControl(string id, System.Web.UI.WebControls.TableCell parent, Appearance style, Inset margin, object val, bool upperLevel)
    {
      TextBox tb;
      TableCell cell;
      TableRow row;
      Table table=new Table();

      for(int i=0;i<items.Length;i++)
      {
        items[i]=items[i].Trim();
        if(items[i]!=null && items[i]!="")
        {
          tb=new TextBox();
          tb.Text=items[i];
          if(upperLevel)
            tb.Attributes.Add("isbox","true");
          cell=new TableCell();
          cell.Controls.Add(tb);
          row=new TableRow();
          row.Cells.Add(cell);
          table.Rows.Add(row);

          tb.Width=Unit.Percentage(100);
          cell.Width=Unit.Percentage(100);
          row.Width=Unit.Percentage(100);
          table.Width=Unit.Percentage(100);
        }
      }
      return table;
    }
  }

-----------------------------------------------
   mylisteditor.htc
-----------------------------------------------
VB サンプルと同様です。

------------------------------------------------
  mylistrender.htc
------------------------------------------------
VB サンプルと同様です。

キーワード
クライアント側スクリプト セル型

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