- PR -

WEBカスタムコントロールにデザイン時でも設定可能なString配列型のプロパティを作成したい

投稿者投稿内容
EOSB200
会議室デビュー日: 2004/04/01
投稿数: 18
投稿日時: 2005-05-06 23:27
こんにちは。
VB.NETでWEBカスタムコントロールを作成しています。
実現したいのが、タイトルの通り、「デザイン時でも設定可能なString配列型のプロパティを作成したい」です。

実際にString()型のプロパティを作成し、VS.NETのプロパティウインドウで値を設定すると、一応設定できた様に見えるのですが、結果は、HTMLコードに「プロパティ名="String[] 配列"」という文字が保存され、設定した値は保存されません。
また、一度プロジェクトを閉じて再度開くと、コントロール自体がエラー表示になります。
確かに、何らかの方法でシリアル化しなければHTMLコードに保存できないと思うのですが、方法がわかりません。

基本的な質問かとは思いますが、ご教授の程よろしくお願い致します。
たつごろー
ぬし
会議室デビュー日: 2004/10/25
投稿数: 496
投稿日時: 2005-05-07 10:42
引用:

実際にString()型のプロパティを作成し、VS.NETのプロパティウインドウで値を設定すると、一応設定できた様に見えるのですが、結果は、HTMLコードに「プロパティ名="String[] 配列"」という文字が保存され、設定した値は保存されません。
また、一度プロジェクトを閉じて再度開くと、コントロール自体がエラー表示になります。


VB.NETであれば配列の扱いはそれほど難しくはありません。

実際にやったということなので、そのうまくいかないコードとエラー内容をご提示いただけますか?

_________________
たつごろー
codeseek
こみゅぷらす
EOSB200
会議室デビュー日: 2004/04/01
投稿数: 18
投稿日時: 2005-05-07 14:58
たつごろー様、ご返答ありがとうございます。
ソース(抜粋)と、エラー内容は次の通りです。

Imports System.ComponentModel
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Class ExTextBox
Inherits System.Web.UI.WebControls.TextBox

Public Sub New()

End Sub

Public Property DataColumnName() As String()
Get
Return CType(ViewState("_DataColumnName"), String())
End Get
Set(ByVal Value As String())
Viewstate("_DataColumnName") = Value
End Set
End Property

End Class

以下の操作は全てVS.NETで行っています。
・上記ソースで作成したWebカスタムコントロールをWebフォームに配置。
・プロパティウインドウのDataColumnNameプロパティ欄にカーソルを持っていくと[...]ボタンが表示されるのでクリック。
・「文字列コレクションエディタ」ウインドウが表示されるので、文字列を入力する。(改行で複数行入力)最後に[OK]ボタンをクリックして確定。
・プロパティウインドウのDataColumnNameプロパティ欄が階層表示になり、入力した文字列が表示される。
・WebフォームのHTMLソースを見ると、次の通りとなっている。
  <cc1:ExTextBox id="ExTextBox1" runat="server" DataColumnName="String[] 配列"></cc1:ExTextBox>
・実行すると次のエラーが発生する
  ------------------
  解析エラー
  説明 : この要求の処理に必要なリソースの解析中にエラーが発生しました。以下の解析エラーの詳細を確認し、ソースファイルに変更を加えてください。
  解析エラー メッセージ: 'DataColumnName' プロパティの文字列形式 'String[] 配列' から型 'System.String[]' のオブジェクトを作成できません。
  ソース エラー:
  行 157: <FONT face="MS UI Gothic">
  行 158: <BR>
  行 159: <cc1:ExTextBox id="ExTextBox2" runat="server" DataColumnName="String[] 配列"></cc1:ExTextBox>
  行 160: </FONT>
  行 161: </form>
  ------------------
・プロジェクトを保存、一旦閉じ、再度開いてWebフォームを見ると、コントロールがグレーの四角になり「コントロールの作成エラー-ExTextBox1(i)」という表示になっている。

よろしくお願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-05-07 21:45
 プロパティで設定するものは、自前でもってください。ViewStateへの格納は、それ用のメソッドで行ってください。

_________________
EOSB200
会議室デビュー日: 2004/04/01
投稿数: 18
投稿日時: 2005-05-08 00:39
Jitta様、ご返答ありがとうございます。
ソースを見直しましたが、結果は全く同じでした。
ご返答内容を理解して修正したつもりですが、勘違いでしたらご指摘下さい。
よろしくお願い致します。

Imports System.ComponentModel
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls

Public Class ExTextBox
  Inherits System.Web.UI.WebControls.TextBox

  Dim _DataColumnName As String()

  Public Sub New()

  End Sub

  Public Property DataColumnName() As String()
    Get
      Return Me._DataColumnName
    End Get
    Set(ByVal Value As String())
      Me._DataColumnName = Value
    End Set
  End Property

  Protected Overrides Function SaveViewState() As Object
    Dim baseState As Object = MyBase.SaveViewState()
    Dim allStates(2) As Object
    allStates(0) = baseState
    allStates(1) = Me._DataColumnName
    Return allStates
    End Function

  Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    Dim myState As Object() = CType(savedState, Object())
    If Not (myState(0) Is Nothing) Then
      MyBase.LoadViewState(myState(0))
    End If
    If Not (myState(1) Is Nothing) Then
      Me._DataColumnName = myState(1)
    End If
  End Sub
End Class


[ メッセージ編集済み 編集者: EOSB200 編集日時 2005-05-08 01:19 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-05-08 06:24
 ない物はありませんから。・・・じゃ、わかりませんよね。

 dim columns() as string と宣言して・・・あれ?宣言文が間違っているから?あ〜、でも、それだったらコンパイラが通知するか。
 まぁ、それもひとつとして、宣言しただけでは空です。宣言したものに、何か放り込んでやってみてください。(デフォルト値の設定)

 あと、配列の数を宣言していないのもまずいでしょう。
_________________
EOSB200
会議室デビュー日: 2004/04/01
投稿数: 18
投稿日時: 2005-05-08 14:47
Jitta様、ご返答ありがとうございます。
早速修正してみますが、現在のプログラムでも、実行時にプロパティに値をセットすると問題なく動作しています。
例)ExTextBox.DataColumnName = New String() {"Data1", "Data2"}

本題は、「デザイン時でも設定可能なString配列型のプロパティを作成したい」ということです。配列操作のロジックを修正しても、HTMLソースに「DataColumnName="String[] 配列"」と保存されてしまうのは解決できないと思いますが、どうでしょうか。

「DesignerSerializationVisibilityAttribute」や「DesignerSerializerAttribute」が関係している様な気がするのですが、調べても理解できない状態です。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-05-08 21:34
これかなぁ?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6266&forum=7

会議室トップ(スレッド一覧)の上の方にある会議室スレッドディレクトリから、タイトルを眺めて検索

[ メッセージ編集済み 編集者: Jitta 編集日時 2005-05-08 21:36 ]

スキルアップ/キャリアアップ(JOB@IT)