- PR -

ASPXでユーザコントロールのイベントの取得方法について

1
投稿者投稿内容
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2007-09-12 20:20
msoです。

ASP.NET(C#)でユーザコントロールのイベントを取得する方法が
サンプルを作成しようと思ったのですが、よく分からず悩んでいます。
不完全というか、まったく動作しないのですがソース1、ソース2のところまで
ユーザコントロールをつくりましたが、この先どうして良いか分かりません。

元々は http://mymio.jugem.jp/?eid=56 のページに書かれていたことを元に
C#で計算するだけのユーザコントロールをやろうと思っていたのですが、
C#にはRaiseEvent が存在しないためうまく動作させることが出来ませんでした。


どうか、教示おねがいします。


ソース1(ascx)
コード:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<asp:TextBox ID="TextBox1" runat="server" Width="70px"></asp:TextBox>
<asp:Label ID="Label1" runat="server" Text="+"></asp:Label>
<asp:TextBox ID="TextBox2" runat="server" Width="70px"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button"  />
<asp:Label ID="Label2" runat="server" Text="答え"></asp:Label>



ソース2(ascx.cs)
コード:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class WebUserControl : System.Web.UI.UserControl
{

    public event EventHandler doCalc;

    public Button btn = new Button();

    protected void Page_Load(object sender, EventArgs e)
    {
        //Button1.Click += new System.EventHandler(this.doCalc);
        

    }

    private int _ansewer = 0;
    public int Answer
    {
        get { return _ansewer; }
        set { _ansewer = value; }
    }


    protected void Button1_Init(object sender, EventArgs e)
    {
        doCalc += new EventHandler(WebUserControl_doCalc);
    }

    void WebUserControl_doCalc(object sender, EventArgs e)
    {
        throw new Exception("The method or operation is not implemented.");
    }

}



よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2007-09-12 21:35
ユーザーコントロールのイベントというより、単にイベント機能でつまづいているようにお見受けします。

イベントの発生は、VBではRaiseEventで行いますが、C#では通常のメソッド呼び出しのように行います。また、イベントハンドラが何も登録されていない場合は、イベントの中身がnullとなっているため、事前にチェックする必要があります。

msoさんの定義した doCalc イベントを発生させる場合は以下のようなコードになります。

コード:
if (this.doCalc != null)
{
    EventArgs e = new EventArgs();
    this.doCalc(this, e);
}




これを機に、イベントそしてデリゲートについて勉強してみることをお勧めします。

_________________
C#と諸々
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2007-09-13 00:00
msoです。

引用:

よこけんさんの書き込み (2007-09-12 21:35) より:
ユーザーコントロールのイベントというより、単にイベント機能でつまづいているようにお見受けします。

(省略)

これを機に、イベントそしてデリゲートについて勉強してみることをお勧めします。



正直なところ今回のことで理解していないとわかりました。
勉強をして理解したいと思いますが、もうすこし教えてください。

さきほどご指摘のコードを記述しようと思ったのですが、
どこに記述して良いのかわかりません。

ユーザコントロールにあるボタンを押したというイベントを
貼り付けた側のフォームで取得するためにどうすれば良いか
わかりません。

ユーザコントロールのプロパティに稲妻のボタンがありません。
どのようにすればイベントを取得できるのでしょうか?
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2007-09-13 00:39
引用:
さきほどご指摘のコードを記述しようと思ったのですが、
どこに記述して良いのかわかりません。

ユーザコントロールにあるボタンを押したというイベントを
貼り付けた側のフォームで取得するためにどうすれば良いか
わかりません。



記述する場所はイベントを発生させたいタイミングです。ユーザーコントロール上のボタンクリック時に発生するのなら、ボタンクリックのイベントハンドラをユーザーコントロールの中に用意してそこで発生させます。なお、イベントを発生させれるのはイベントを定義したクラス内のみです。

ユーザーコントロールを貼り付けたフォーム側でイベントにハンドラを登録するには、ユーザーコントロールのタグの属性で記述することができます。(コードで直接登録することも可能です。)

コード:
<uc1:WebUserControl id="sample" runat="server" doCalc="sample_doCalc" />



後はコードの方に protected void sample_doCalc(object sender, EventArgs e) メソッドを定義すればOKです。


引用:
ユーザコントロールのプロパティに稲妻のボタンがありません。
どのようにすればイベントを取得できるのでしょうか?



確か、C#だとデザイナからのイベントハンドラの登録は出来なかったような気がします。(私はデザイナを使わないので、その辺のことはよく知らないですね・・・。)
_________________
C#と諸々
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2007-09-13 09:25
イベントとデリゲートについてある程度イメージがつかめたら読んでみてください。
「イベントのデザイン」
http://msdn2.microsoft.com/ja-jp/library/ms229011(VS.80).aspx
イベントを定義するときにどうしたら良いかが書いてあります。

マイクロソフトは、イベントは Onイベント名() というメソッドからだけ発生(raise)させることを推奨しているようです。


[ メッセージ編集済み 編集者: 一郎 編集日時 2007-09-13 09:26 ]
1

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