2013-07-24 21 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

相關問題