- PR -

複合コントロールのプロパティの値維持について

1
投稿者投稿内容
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-19 14:46
vb.netで、WEBの複合コントロールの作成をしています。
プロパティに色をセットして、2つのテキストボックスをプロパティにセットした背景で表示するコントロールを開発していますが、ポストバック時以外の場合のみ色をセットしたところ、ポストバック時にプロパティの値が空になってしまいます。
プロパティの値をVIEWSTATEに保存するようにしないと値の保持はできないのでしょうか?

ユーザーコントロールのコード
<ToolboxData("<{0}ataEntryPanel runat=server></{0}ataEntryPanel>")> _
Public Class DataEntryPanel
Inherits WebControl
Implements INamingContainer

Protected colTitleBackColor As Color 'タイトルの背景色

<Category("Appearance"), DefaultValue("#007399")> _
Property [TitleBackColor]() As String
Get
Return ColorTranslator.ToHtml(colTitleBackColor)
End Get
Set(ByVal Value As String)
colTitleBackColor = ColorTranslator.FromHtml(Value)
End Set
End Property
Protected Overrides Sub CreateChildControls()
Dim txt As New TextBox
txt.Text = ColorTranslator.ToHtml(colTitleBackColor)
txt.BackColor = colTitleBackColor
Me.Controls.Add(txt)
Dim txt2 As New TextBox
txt2.Text = ColorTranslator.ToHtml(colTitleBackColor)
txt2.BackColor = colTitleBackColor
Me.Controls.Add(txt)
End Sub
End Class

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
Cc_DataEntry.TitleBackColor = "red"
End If
End Sub
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-01-19 16:14
ゆっきーさん、こんにちは。

引用:

プロパティの値をVIEWSTATEに保存するようにしないと値の保持はできないのでしょうか?



そうですね。基本的には LoadViewState / SaveViewState をオーバーライドして値を保持します。

ところで、何でプロパティの型を String にしているのでしょうか?

コード:
Protected colTitleBackColor As Color      'タイトルの背景色

<Category("Appearance"), DefaultValue("#007399")> _
Property [TitleBackColor]() As String
    Get
        Return ColorTranslator.ToHtml(colTitleBackColor)
    End Get
    Set(ByVal Value As String)
        colTitleBackColor = ColorTranslator.FromHtml(Value)
    End Set
End Property


きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-01-19 16:16
ゆっきーさん、こんにちは。

引用:

プロパティの値をVIEWSTATEに保存するようにしないと値の保持はできないのでしょうか?



そうですね。基本的には LoadViewState / SaveViewState をオーバーライドして値をViewState に保持するようにします。

ところで、何でプロパティの型を String にしているのでしょうか?

コード:

Protected colTitleBackColor As Color 'タイトルの背景色

<Category("Appearance"), DefaultValue("#007399")> _
Property [TitleBackColor]() As String
Get
Return ColorTranslator.ToHtml(colTitleBackColor)
End Get
Set(ByVal Value As String)
colTitleBackColor = ColorTranslator.FromHtml(Value)
End Set
End Property



【追記】
編集するつもりで、引用してしまった…。orz

[ メッセージ編集済み 編集者: きくちゃん 編集日時 2007-01-19 17:05 ]
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-19 16:45
きくちゃんさん回答ありがとうございます。試してみたところうまくいきました。
プロパティの型を String にしたのは、HTMLから変換してセットするのが面倒だったので・・・。

今回のコントロールはプロパティの保存が効くかのお試しみたいなもので、最終的にはテキストボックスだのラジオボタンだのの属性が保存してあるテーブルを読みながら動的にWEBフォームを作成するカスタムコントロールを作ることです。
以下サンプル(C#ですが)を見るとVIEWSTATEは使用不可になっているし、datatableはポストバック時以外しかセットされていなくて、どこで出力元のdatatableが保持されているのかが分からなくて困っています。
どなたかアドバイスよろしくお願いいたします。

http://japan.internet.com/developer/20051108/26.html
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2007-01-19 17:39
ゆっきーさん、こんばんは。

引用:

以下サンプル(C#ですが)を見るとVIEWSTATEは使用不可になっているし、datatableはポストバック時以外しかセットされていなくて、どこで出力元のdatatableが保持されているのかが分からなくて困っています。


サンプル見ましたが、ポストバック時でもコントロールを表示する場合(chkShowList がチェックされている場合)は、毎回、データの取得を行うようになってませんか?
他のプロパティについても、ポストバック時に値を復元する事は考慮していないように見えます。
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-19 18:30
失礼しました(汗)。C#の||ってANDではなくOR条件ですね。勘違いをしていました。

DBを読んで動的にコントロールを作成するには、やはりポストバックのたびにコントロールを再構成するしかないんでしょうね・・・。
コントロールを構成するデータを取り込む方法としては
@コントロールを実装するページ側でデータを取得してカスタムコントロール側のプロパティにセットする
Aカスタムコントロール側でデータを毎回取得する
になると思ういます。
Aの場合、DBの接続情報を実装するページのwebconfigに記述しているのですが、カスタムコントロール側から取得は可能でしょうか?プロパティにしてViewstateに保存するのも危険そうな感じで・・・。
ゆっきー
ベテラン
会議室デビュー日: 2006/04/21
投稿数: 65
投稿日時: 2007-01-19 18:30
失礼しました(汗)。C#の||ってANDではなくOR条件ですね。勘違いをしていました。

DBを読んで動的にコントロールを作成するには、やはりポストバックのたびにコントロールを再構成するしかないんでしょうね・・・。
コントロールを構成するデータを取り込む方法としては
@コントロールを実装するページ側でデータを取得してカスタムコントロール側のプロパティにセットする
Aカスタムコントロール側でデータを毎回取得する
になると思ういます。
Aの場合、DBの接続情報を実装するページのwebconfigに記述しているのですが、カスタムコントロール側から取得は可能でしょうか?プロパティにしてViewstateに保存するのも危険そうな感じで・・・。
1

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