2013-07-24 25 views
0

我有一个问题,我无法在我的项目的服务器端解决。事件不会与用户控件一起工作

我会解释:

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

我决定使用委托(事件)

这是代码。

全球页面:

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

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事件...

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

+0

仍然在这里看,但不能错过'CateGories'。这是一种新的命名方式吗? – melancia

+0

这是错误的首都'G':) – MaxPetya

+0

不用担心的人。它发生了。 :)但我无法找到帮助你的方法。 – melancia

回答

0

我想我以前遇到过这个问题,当时我使用web应用程序来处理windows应用程序。

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

+0

你能举一个例子吗?,我从来没有使用viewstate,我想它就像一个Cache。 – MaxPetya

+0

你是对的!我做了一个函数来创建一个实例,并将所需的函数添加到事件中,并调用该事件。 – MaxPetya

+0

很高兴听到你想通了。我搜索了一下,似乎你不能在视图状态下存储一个解析器。用像你这样的功能启动它将是最好的方式去做。 – Naoe

0

对于我所能看到的,MainDel确实为null。

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

一种可能的方式是在PageLoad()之前以编程方式创建用户控件并将其添加到页面中,并保留对它的引用以便可以访问它的属性。

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

上面的方法名称可能不正确,它已经很长时间没有使用网页表单。

+0

这是一个很好的理论,但我做了其他程序与类似的代码,它的工作,所以我不明白为什么它不起作用。 – MaxPetya

相关问题