DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ユーザコントロールからプロパティ変更

環境/言語:[Win2000, VB.net]
分類:[.NET]

ユーザコントロールのリンクボタンの押下時、
親画面のコントロールのプロパティを変更したいのですが、
どのようにすればよいのでしょうか?
よろしくお願いします。
■No1591に返信(しおしおさんの記事)
> ユーザコントロールのリンクボタンの押下時、
> 親画面のコントロールのプロパティを変更したいのですが、
> どのようにすればよいのでしょうか?
> よろしくお願いします。

ボタンが押されたらユーザ定義のイベントが発生するコードを、ユーザコントロール内に記述しましょう。
親画面で、そのイベントを使って処理を行います。
レスありがとうございます!
ユーザコントロールのボタンクリックイベントプロシージャ内で
直接親画面のコントロールを制御することは出来ないのでしょうか?
以下のように書いてみたのですが、クリックすると
「オブジェクト参照がオブジェクト インスタンスに設定されていません」
というエラーが出てしまうのですが・・・
ご教授お願いします。

Public MustInherit Class UserControl1
  Inherits System.Web.UI.UserControl
  Public WithEvents lnk1 As System.Web.UI.WebControls.LinkButton

  Public WithEvents OyaGamen1 As OyaGamen1


  Private Sub lnk1_Click(ByVal sender As Object, _
           ByVal e As System.EventArgs) Handles lnk1.Click
    OyaGamen1.DBgrid1.PageSize = 20

  End Sub
End Class
> 「オブジェクト参照がオブジェクト インスタンスに設定されていません」
OyaGamen1は変数宣言されているだけで空です。
表示されている親画面のインスタンスを設定してあげる必要があります。
OyaGamen1 = Page
で現在表示されているページを取得できます。
もう少し確実に親画面のインスタンスを設定するには、親画面の初期化時に、
ユーザコントロールにMeを渡すという方法もあります。

>     OyaGamen1.DBgrid1.PageSize = 20
ただし、親画面自信のプロパティを変更するならともかく、上記のように親画面内のコントロールのプロパティを変更するなら、ユーザコントロールの役割を超えています。
このユーザコントロールはOyaGamen1上に貼り付けたときにしか動作しないものとなり、
ユーザコントロールである意義をなくしてしまします。
処理は親画面内のコードに書くべきであり、その処理を呼び出すためにイベントを使います。

もし、親画面自信のプロパティを変更する処理をしたいならば、
Public WithEvents OyaGamen1 As Page
とすることで、OyaGamen1だけでなく、どんなページにでも使えるユーザコントロールになります
親画面内でプロパティ変更の処理をするようにしてみました。
ユーザコントロールでイベントを拾い、親画面のプロシージャに飛ぶことは
出来たのですが、プロパティ変更が出来ませんでした。

> 処理は親画面内のコードに書くべきであり、その処理を呼び出すためにイベントを使います。

とのことですが、イベントプロシージャに書かないとだめなのでしょうか?
何度も初歩的な質問をしてしまって申し訳ありません。
ご教授いただければ幸いです。
よろしくお願い致します。

---ユーザコントロール---
Private Sub lnk1_Click(ByVal sender As Object,
    ByVal e As System.EventArgs) Handles lnk1.Click

  Dim OyaGamen1 As New OyaGamen1()
  OyaGamen1.Hyoji()
End Sub

---親画面---
Public Sub Hyoji()
  DBgrid1.Pagesize = 20
End Sub
>   Dim OyaGamen1 As New OyaGamen1()
ここでNewした親画面は新しく作成されるもので、表示中の親画面とは違います


ユーザコントロール内で、カスタムイベントを作成して、親画面で受信します

ユーザコントロール側

Public Event UserButtonClick As EventHandler

Private Sub LinkButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                 Handles LinkButton1.Click
  RaiseEvent UserButtonClick(Me, EventArgs.Empty)
End Sub

親画面HTML

<uc1:WebUserControl1 id="WebUserControl1" runat="server"></uc1:WebUserControl1>
をユーザコントロールを表示したい場所に記述

親画面コード

Protected WithEvents WebUserControl1 As WebUserControl1

Private Sub WebUserControl1_UserButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                 Handles WebUserControl1.UserButtonClick

//処理

End Sub

VB.NETだと親画面のHTMLをさわらないといけないので少しややこしいですね
(私はC#ユーザなので知りませんでした)
C#でもHTMLさわらないといけないか。
はじめに作ったときにさわった記憶がないけど勘違いかもしれない・・・
ご教授の方法で出来ました。
カスタムイベントを使ったことがなかったので、とても勉強になりました。
Mikeさま、丁寧に教えて頂きまして、本当にありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板