7

私はこれについて広範囲に検索しましたが、私の問題の解決策を見つけることができません。そのページのユーザーコントロールから、ページの背後にあるコードで関数を呼び出そうとしています。

マスターページを使用するWebアプリケーションがあります。コンテンツページの1つに書き込んだユーザーコントロールを追加しています。ツールボックスからドラッグアンドドロップして、aspxページにユーザーコントロールを追加しました。コードビハインドからユーザーコントロールを確認できますが、パブリック関数にアクセスできません。この問題を修正するために、コードビハインドでユーザーコントロールのオブジェクトを作成し、LoadControl関数を使用しました。それはすべてうまくいくようです。

私が抱えている問題は、aspxページからユーザーコントロールにをEventHandlerにフックしようとしているときです。すべてが正常にコンパイルおよび実行されますが、ページで何も発生していません。問題は、EventHandlerが常にnullであるということだと思います。

ユーザー制御コード

public partial class ucBuyerList : System.Web.UI.UserControl
{
    public delegate void BuyerSelectedEventHandler(object sender, EventArgs e);
    public event BuyerSelectedEventHandler BuyerSelected;

    private string name = "";
    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    private string auid = "";
    public string AUID
    {
        get { return auid; }
        set { auid = value; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    private void OnBuyerSelected(EventArgs e)
    {
        if (BuyerSelected != null)
        {
            BuyerSelected(this, new EventArgs());
        }
    }

    protected void lbBuyerList_SelectedIndexChanged(object sender, EventArgs e)
    {
        SetNameAndAUID();
        OnBuyerSelected(e);
    }

    private void SetNameAndAUID()
    {
        name = lbBuyerList.SelectedItem.Text;
        auid = lbBuyerList.SelectedItem.Value;
    }
}

親ページコード

    public partial class frmBuyerInformation : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Master.changePageTitle("Buyer Information");
        buyerList.BuyerSelected += new ucBuyerList.BuyerSelectedEventHandler(buyerListControl_BuyerSelected);
    }

    void buyerListControl_BuyerSelected(object sender, EventArgs e)
    {
        DisplayBuyerInformation();
    }

    public void DisplayBuyerInformation()
    {
        tbName.Text = buyerList.Name;
        tbAUID.Text = buyerList.AUID;
    }
}

誰かが私が間違っていることを見ることができますか?

編集:この問題は解決されました。上記のコードスニペットが機能するようになりました。誰かが私が抱えていた問題に遭遇した場合は、上記のコードをモデル化できます。AutoEventWireup="true"aspxページとascxページの両方でそれを確認してください。解決策をありがとうJunePaik。ディエゴ・デ・ヴィータにもご意見をお寄せいただきありがとうございます。

4

2 に答える 2

2

私もかなり前からイベントに苦労してきました。今日、私はいつもこの方法でそれらを作成します。なぜなら、それが機能することを私が知っている唯一の方法だからです。あなたのコードでそれをテストしていませんが、とにかくここに行きます:

public partial class ucBuyerList : System.Web.UI.UserControl
{
    public delegate void BuyerSelectedEventHandler(object sender, EventArgs e);

    public event BuyerSelectedEventHandler BuyerSelected;

    public string Name;
    public string AUID;

    protected void Page_Load(object sender, EventArgs e)
    {
        //Select the first buyer in the list when the user control loads

        if (!IsPostBack)
        {
            lbBuyerList.SelectedIndex = 0;
        }
    }

    private void OnBuyerSelected(EventArgs e)
    {
        BuyerSelectedEventHandler handler = BuyerSelected;
        if (handler != null)
        {
            handler(this, new EventArgs());
        }
    }

    protected void lbBuyerList_SelectedIndexChanged(object sender, EventArgs e)
    {
        Name = lbBuyerList.SelectedItem.Text;
        AUID = lbBuyerList.SelectedItem.Value;
        OnBuyerSelected(e);
    }
}

親ページでは、すでに行っているのと同じ方法で関数を呼び出すことができます。

于 2012-07-30T22:27:25.733 に答える
1

Page_LoadLoadControlを使用してイベントをサブスクライブするには、ページのライフサイクルが遅すぎる可能性があります。そのコードをメソッドに移動するとどうなりますPage_Initか?

于 2012-07-30T21:05:25.773 に答える