事件处理程序始终为null

时间:2012-07-30 20:55:39

标签: c# asp.net user-controls event-handling null

我已经对此进行了广泛的搜索,但无法找到解决问题的方法。我试图在该页面上的用户控件的页面代码后面调用一个函数。

我有一个使用母版页的Web应用程序。我正在添加一个我写入其中一个内容页面的用户控件。我通过从工具箱中拖放来将用户控件添加到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;
    }
}

谁能看到我做错了什么?

编辑:此问题已得到解决。上面的代码snippits现在正在运行。如果有人遇到我遇到的问题,你可以对上面的代码进行建模。确保aspx和ascx页面中都有AutoEventWireup="true"。感谢June Paik提供的解决方案。感谢Diego De Vita的投入。

2 个答案:

答案 0 :(得分: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);
    }
}

在父页面中,您可以像调用函数一样调用函数。

答案 1 :(得分:1)

可能是Page_Load在页面生命周期中为时太晚而无法使用LoadControl并订阅该事件。如果将代码移到Page_Init方法会发生什么?

相关问题