事件不适用于用户控件

时间:2013-07-24 12:21:28

标签: c# asp.net .net events delegates

我遇到一个问题,我无法在项目的服务器端解决。

我会解释:

我有一个名为Global的页面,这是ASP.NET页面。 此页面使用名为CateGories的UserControl。 现在我在这个UC页面上有一个按钮,当我按下时我想在全局页面上调用一个与我的数据库建立连接的功能。

我决定使用代表(活动)

这是代码。

全球网页:

//这里我将我的功能添加到事件

protected  void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ShowCurrentTime.Text = DateTime.Now.ToString();
        }
        CateGories ClassCat = new CateGories();
        ClassCat.MainDel += PopulateLinks;
    }

//这是事件将运行的函数

 public void PopulateLinks(string CategoryName)
    {....}

UC页面代码(CateGories):

//事件委托

public delegate void Click(string ButtonName);
public event Click MainDel = null;

//单击按钮时调用的函数

protected void News_Click(object sender, EventArgs e)
    {
        if (MainDel != null)
        {
            MainDel(News.Text);
        }
    }

现在everythig应该可以正常工作,但是当编译器到达时会出现问题 if(MainDel!=null) ...

它没有进入函数,那里的MainDel为null。 我在这里看不到问题,为什么在我向MainDel插入函数后,它得到null eventualy ...

如果有人可以提供帮助,我会很高兴 谢谢。 最大

2 个答案:

答案 0 :(得分:0)

我认为我之前遇到过这个问题,就像我在Windows应用程序中使用Web应用程序一样。

问题在于,当重新加载页面时,会创建页面类的新实例,因此上次服务器交互中的任何值都将丢失。

答案 1 :(得分:0)

对于我能看到的内容,MainDel确实为空。

您正在Web窗体上创建一个CateGories实例,而在用户控件上创建另一个CateGories实例。一旦你在UC上检查它是否为null,就会引用未初始化的对象。

一种可行的方法是在PageLoad()之前以编程方式创建和添加用户控件,并保留对它的引用,以便您可以访问它的属性。

另一种解决方案可能是使用Page.FindControl来查找UC并订阅该事件。

上面的方法名称可能不正确,如果不使用网络表单已经很长时间了。