【セル型】ラジオボタンのグループを列に対して設定したい

文書番号 : 21852     文書種別 : 使用方法     最終更新日 : 2006/06/23
文書を印刷する
対象製品
SPREAD for .NET 2.5J Web Forms Edition
詳細
製品のRadioButtonListCellTypeはセルに対してグループを設定します。
そのため1つのセルの中にラジオボタンが幾つか配置され、セルの中で排他的にこれらをチェックできるという動作になります。

ただ、アプリケーションでは列内の各セルに1つずつラジオボタンを配置し、列内で排他的にチェックできるようにしたいことがあります。

これはRadioButtonListCellTypeクラスを継承するカスタム型セルを作成することで実現できます。
下記はこの様なカスタムラジオボタン型セルのサンプルコードです。

【カスタムラジオボタン型の注意点】
1.このセル型は列に対して設定して下さい。
2.Itemsで指定するリストの選択項目の個数は行数に合わせて下さい。
3.ラジオボタン選択の有無はページのポストバック時に検出できます。

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

【VB サンプルコード】
-----------------------------------------
    Webフォームクラス
-----------------------------------------

  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim rcelltype As New myRadioCellType
    Dim i As String
    Dim j As Integer

    If IsPostBack Then
      ' ポストバック時にラジオボタン選択の有無を調べます
      i = Page.Request.Form("radiobtn")
      If Not (i Is Nothing) Then
        'チェックされたいるボタンのみ、セルの値を1に設定
        For j = 0 To FpSpread1.Sheets(0).RowCount - 1
          FpSpread1.Sheets(0).Cells(j, 1).Value = 0
        Next
        FpSpread1.Sheets(0).Cells(CInt(i), 1).Value = 1
      End If
      Return
    End If

    FpSpread1.Sheets(0).RowCount = 3

    rcelltype.Items = New String() {"up", "side", "down"}
    FpSpread1.Sheets(0).Columns(1).CellType = rcelltype
    FpSpread1.Sheets(0).Columns(1).Locked = True

  End Sub

-----------------------------------------
    カスタムセル型クラス
(mRadioCellTypeクラス, MyBtnクラス)
-----------------------------------------
Imports System.Web.UI
Imports FarPoint.Web.Spread

<Serializable()> Public Class myRadioCellType
  Inherits FarPoint.Web.Spread.RadioButtonListCellType

  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 row As String
    Dim myid As String
    Dim idarray As String() = id.Split(",".ToCharArray())

    myid = idarray(0)
    row = CStr(id.Split(",".ToCharArray()).GetValue(0))
    Dim c As RadioButton = New MyBtn(Items(CInt(row)))
    c.ID = myid
    If CStr(value) = "1" Then
      c.Checked = True
    End If
    Return c

  End Function

  Public Overrides Function Format(ByVal o As Object) As String
    If Not o Is Nothing Then
      Return o.ToString
    Else
      Return MyBase.Format(o)
    End If
  End Function

End Class

<Serializable()> Public Class MyBtn
  Inherits RadioButton
  Dim radiotext As String

  Public Sub New()

  End Sub

  Public Sub New(ByVal text As String)
    radiotext = text
  End Sub

  Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    If Me.Checked = True Then
      writer.WriteLine("<span><input id=""gc"" type=""radio"" CHECKED name=""radiobtn""value=""" & Me.ID & """ />" & radiotext & "</span>")
    Else
      writer.WriteLine("<span><input id=""gc"" type=""radio"" name=""radiobtn""value=""" & Me.ID & """ />" & radiotext & "</span>")
    End If
  End Sub

End Class


【C# サンプルコード】
-----------------------------------------
    Webフォームクラス
-----------------------------------------
  private void Page_Load(object sender, System.EventArgs e)
  {
      myRadioCellType rcelltype=new myRadioCellType();
      string i;

      if(IsPostBack)
      {
        //ポストバック時にラジオボタン選択の有無を調べます
        i=Request.Form["radiobtn"];
        if(i!=null)
        {
          //チェックされたいるボタンのみ、セルの値を1に設定
          for(int j=0;j<FpSpread1.Sheets[0].RowCount;j++)
            FpSpread1.Sheets[0].Cells[j,1].Value=0;
          FpSpread1.Sheets[0].Cells[Int32.Parse(i),1].Value=1;
        }
        return;
      }

      FpSpread1.Sheets[0].RowCount=3;
      rcelltype.Items = new String[] {"up", "side", "down"};
      FpSpread1.Sheets[0].Columns[1].CellType = rcelltype;
      FpSpread1.Sheets[0].Columns[1].Locked = true;
  }

-----------------------------------------
    カスタムセル型クラス
(mRadioCellTypeクラス, MyBtnクラス)
-----------------------------------------
using System.Web.UI;
using FarPoint.Web.Spread;

  [Serializable()]public class myRadioCellType:RadioButtonListCellType
  {
    public override Control PaintCell(string id, TableCell parent, Appearance style, Inset margin, object ovalue, bool upperLevel)
    {
      string row;
      string myid;
      string[] idarray = id.Split(',');

      myid = idarray[0];
      row = (string)id.Split(',').GetValue(0);
      RadioButton c = new MyBtn(Items[Int32.Parse(row)]);
      c.ID = myid;

      if(ovalue!=null && ovalue.ToString()=="1")
        c.Checked=true;
    
      return c;
    }
    public override string Format(object o)
    {
      if(o!=null)
        return o.ToString();
      return null;
    }
  
  }
  [Serializable()]public class MyBtn:RadioButton
  {
    string radiotext;

    public MyBtn():base(){}
    public MyBtn(string text){radiotext=text;}

    protected override void Render(HtmlTextWriter writer)
    {
      System.Text.StringBuilder str=new System.Text.StringBuilder();
      if (base.Checked)
        str.Append("<span><input id='gc' type='radio' CHECKED name='radiobtn' value='");
      else
        str.Append("<span><input id='gc' type='radio' name='radiobtn' value='");

      str.Append(base.ID);
      str.Append("'/>");
      str.Append(radiotext);
      str.Append("</span>");

      writer.WriteLine(str.ToString());
    }


  }
キーワード
セル型

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