none
デリゲートを利用したコントロールの状態遷移 RRS feed

  • 質問

  • webフォーム上でDetailsViewの外に配置したボタンから、DetailsViewの状態を制御させたいと思っております。

    その際に、デリゲートを用いているのですが1点だけ引っかかるところがあったので投稿させていただきました。

     

    以下、ソースの抜粋になります。

    Code Snippet

    Partial Class tstVB
        Inherits System.Web.UI.Page

     

        'ページロード時イベントハンドラ
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            'モード変更時デリゲートを追加
            Authors1.onModeChange +=
    onFormViewModeChange()
        End Sub

     

    '「確認」ボタン押下時イベントハンドラ
    ・・・(略)

    '「更新」ボタン押下時イベントハンドラ

    ・・・(略)

     

        'FormView モード変更時デリゲートメソッド
        Private Sub onFormViewModeChange(ByVal bEdit As Boolean)
            If bEdit = False Then
               
    'ボタン表示状態変更
                Button_Confirm.Enabled = True
                Button_Update.Enabled = False
            Else
               
    'ボタン表示状態変更
                Button_Confirm.Enabled = False
                Button_Update.Enabled = False
            End If
        End Sub

    End Class

     

     

     
    Partial Class authors
        Inherits System.Web.UI.UserControl
     
        'モード変更時コールバック実行用デリゲート
        Public Delegate Sub ModeChange(ByVal bEdit As Boolean)
        Public onModeChange As ModeChange = Nothing
     
        'FormView モード(追加版)プロパティ
        Private _formViewMode As eFormViewMode = eFormViewMode.MODE_EDITEDIT
        Public Property FormViewMode() As eFormViewMode
            Get
                Return _FormViewMode
            End Get
            Set(ByVal value As eFormViewMode)
                _formViewMode = value
               
    'セッション情報に保存
                Session(_strFormViewMode) = _formViewMode
                Select Case _formViewMode
                    Case eFormViewMode.MODE_EDITEDIT
                        ' FormView を Edit モードに変更
                        FormView1.ChangeMode(WebControls.FormViewMode.Edit)
                       
    'テキストボックスの状態変更
                        changeModeEditEdit()
                    Case eFormViewMode.MODE_EDITCONFIRM
                       
    'テキストボックスの状態変更
                        changeModeEditConfirm()
                    Case eFormViewMode.MODE_READONLY
                       
    'FormView を ReadOnly モードに変更
                        FormView1.ChangeMode(WebControls.FormViewMode.ReadOnly)
                End Select
                '親側のボタン状態変更
                If Not onModeChange Is Nothing Then
                    onModeChange(_formViewMode <> eFormViewMode.MODE_READONLY)
                End If
            End Set
        End Property
     
        'FormView モード(追加版)セッション識別子
        Private _strFormViewMode As String = "FormViewMode
     

      ・・・(略)

     

    End Class

     
    上記1つ目のコード中のAuthors1.onModeChange += onFormViewModeChange()では
    onFormViewModeChangeに引数を指定しろときます。
    また、とりあえずという形でTrue/Falseの値を設定してみても「式は値を生成しません」
    となってしまいます。
     
    上記コード中をどういうふうに修正すればうまくいくのか、ご意見・ご指摘などありましたら
    お願いします。
    2008年2月18日 12:11

回答

  • 閣下 さん、こんにちは

    ダッチです。

     

    こちらの部分を次のようにしてみてはどうでしょうか。

    Code Snippet

    ' Authors1.onModeChange += onFormViewModeChange()


    Authors1.onModeChange = AddressOf onFormViewModeChange

     

    もっと丁寧に書くと次のようになります。

     

    Code Snippet
    Authors1.onModeChange = New authors.ModeChange(AddressOf onFormViewModeChange)

     

     

    += は C# のときの使い方だと思います。

    Visual Basic では AddressOf を使用してデリゲートを使用します。

    イベントハンドラの動的関連付けも AddressOf を使用します。

    2008年2月18日 12:34

すべての返信

  • 閣下 さん、こんにちは

    ダッチです。

     

    こちらの部分を次のようにしてみてはどうでしょうか。

    Code Snippet

    ' Authors1.onModeChange += onFormViewModeChange()


    Authors1.onModeChange = AddressOf onFormViewModeChange

     

    もっと丁寧に書くと次のようになります。

     

    Code Snippet
    Authors1.onModeChange = New authors.ModeChange(AddressOf onFormViewModeChange)

     

     

    += は C# のときの使い方だと思います。

    Visual Basic では AddressOf を使用してデリゲートを使用します。

    イベントハンドラの動的関連付けも AddressOf を使用します。

    2008年2月18日 12:34
  • To:ダッチさん

     

    解決しましたどうもありがとうございますm(_ _)m

     

    >+= は C# のときの使い方だと思います。

    デリケードでメソッドを呼ぶ場合、「+=」はダメだったんですね。。。

    msdnを読んで理解を深めたいと思います。

     

    重ね重ねになりますが、ありがとうございました。

    2008年2月18日 13:01