2014-03-25 52 views
0

我有這樣的代碼在我隱藏:爲什麼我的Linkbuttons命令沒有被觸發?

for (int i = 0; i < linkList.Count; i++) 
      { 
       var link = UppercaseFirst(linkList[i]); 
       var linkButton = new LinkButton 
        { 
         Text = link + " > ", 
         ID = Convert.ToString(i), 
         CommandArgument = urlList[i] 
        }; 
       linkButton.Command += new CommandEventHandler(lnkWeb_Click); 
       bcHolder.Controls.Add(linkButton); 

      } 

這裏是lnkWeb_Click方法:

protected void lnkWeb_Click(object sender, CommandEventArgs e) 
     { 
      var url = e.CommandArgument.ToString(); 
      //code... 
     } 

當我點擊這些產生了LinkBut​​ton的一個這種方法沒有得到觸發。

任何人有任何的想法是什麼問題?

在aspx文件試圖OnCommand="lnkWeb_Click"和方法得到觸發,而不是那些我通過代碼生成。他們甚至沒有OnCommand="lnkWeb_Click"屬性。

+0

何時以及如何調用將鏈接按鈕添加到頁面的代碼? – Andrei

+0

它occures每次lnkWeb_Click被其他了LinkBut​​ton – Obsivus

+0

觸發所以用戶點擊按鈕(1),他們增加更多的按鈕(2)的頁面,用戶點擊(2)按鈕之一,其處理程序不被調用。對? – Andrei

回答

1

的問題在這裏與控制生命週期。如果您想正確處理某些控件的事件 - 您必須將此控件添加到每個頁面加載過程的頁面上,即在每次回發時。

是什麼,你的情況發生了:

  1. 初始按鈕被點擊
  2. 在回傳動態鏈接按鈕添加到頁面,事件處理程序分配給他們
  3. 用戶點擊新生成的鏈接按鈕
  4. 在回傳這些動態鏈接按鈕不會添加到頁面再次,ASP.NET不知道事件的起源,因此不會調用處理程序。

要解決這個問題,您可能需要在視圖狀態信息中存儲關於必須添加的鏈接按鈕的信息(請不要自行存儲控件,這將是一個巨大的開銷)。還要注意他們的ID - 他們必須是相同的控制相同。

更新。關於View State解決方案的更多提示。

基本上你需要一些指標,該頁面加載過程中,你需要創建一些動態鏈接按鈕。這樣做的最基本的方法是存儲鏈接按鈕標識符(或文本,或兩者)的列表,然後在Page_Load期間檢查是否存在視圖狀態中存儲的任何內容。例如:

// Property to access the view state data 
protected List<string> Links 
{ 
    get { return ViewState['links']; } 
    set { ViewState['links'] = value; } 
} 

... 

protected void Page_Load(object sender, EventArgs e) 
{ 
    ... 
    if (this.Links != null && this.Links.Count > 0) 
    { 
     // inside this method you create your link buttons and add them to the page 
     // you actually have this code already 
     RenderLinkButtons(); 
    } 
} 

... 

// Not sure about what name you have here 
protected void InitialButtonHandlerName(object sender, EventArgs e) 
{ 
    List<string> linkList = ...; //your variable, guessing a type 

    // this is exactly the method you use already to add links to the page 
    // just one more action added to it - store info about these links into View State to use it on later post backs 
    this.Links = linkList; 
    RenderLinkButtons();  
} 

請使用它只是在正確的方向的一個點 - 你可能會根據您的要求和喜好有不同的實現。但我希望現在概念清晰。

+0

正在存儲視圖狀態唯一的選擇,是否沒有簡單的修復? – Obsivus

+0

@Obsivus,不幸的是,這是我能想到的唯一一個(可能還有其他的,我只是不知道它們)。動態控制是棘手的生物。然而,View State方式並不是那麼糟糕。至少它可以只是'ViewState ['links'] =新列表()',然後在頁面加載檢查:如果ViewState ['links']中有某些東西 - 渲染鏈接,否則什麼都不做。你已經完成了絕大部分的工作 – Andrei

+0

什麼事情我應該使用viewstate? – Obsivus

相關問題