2012-05-04 55 views
2

我已經閱讀了一些關於這裏和網頁的文章,這些文章告訴我,我不能簡單地向頁面動態添加一個新的控件,將它連接到一個處理程序,並期望它工作。在Page_Load上不添加動態控件處理事件?

每次給出的解決方案是每次都需要將動態控件添加到Init頁面上。

我的問題是,我的控件不會添加到init頁面上,它們會在ANOTHER回發後添加。

工作流程是這樣的:

  1. 頁荷載
  2. 用戶填寫文本框,點擊一個按鈕
  3. 頁面回,基於輸入的button_click事件創建動態鏈接控制
  4. 用戶單擊其中一個鏈接控件即可繼續下一步。

所以,如果這是我需要支持的行爲,有沒有辦法做到這一點?它必須發生在步驟2的button_click中,因爲動態控制是基於用戶在步驟2中輸入的輸入。

我是否在這裏畫了一個角?我還能如何處理這樣的工作流程?

+0

如果您的工作流程涉及 「臺階」,窺視ASP.Net嚮導控制。 – EdSF

+0

這是一個很好的建議,我最初想到了這個,但是想盡快完成,然後回頭看看使用嚮導。這可能只是做的伎倆,謝謝,將報告返回 – SelAromDotNet

回答

2

動態創建鏈接按鈕後,在頁面的視圖狀態中設置一個標誌。在回發時,如果標誌設置爲視圖狀態,則重新創建鏈接按鈕。這裏有一個演示:

標記:

<asp:Button runat="server" ID="button1" OnClick="button_Click" Text="Create button A" CommandArgument="A" /> 
<asp:Button runat="server" ID="button2" OnClick="button_Click" Text="Create button B" CommandArgument="B" /> 
<asp:PlaceHolder runat="server" ID="placeHolder"></asp:PlaceHolder> 

代碼隱藏:

public partial class Default : System.Web.UI.Page 
{ 
    private bool LinkButtonCreated 
    { 
     get { return ((bool?)this.ViewState["LinkButtonCreated"]).GetValueOrDefault(); } 
     set { this.ViewState["LinkButtonCreated"] = value; } 
    } 

    private string LinkButtonCommandArgument 
    { 
     get { return (string)this.ViewState["LinkButtonCommandArgument"]; } 
     set { this.ViewState["LinkButtonCommandArgument"] = value; } 
    } 

    protected override void LoadViewState(object savedState) 
    { 
     base.LoadViewState(savedState); 
     if (this.LinkButtonCreated) 
      this.CreateLinkButton(this.LinkButtonCommandArgument); 
    } 

    protected void button_Click(object sender, EventArgs e) 
    { 
     if (!this.LinkButtonCreated) 
     { 
      string commandArgument = ((Button)sender).CommandArgument; 
      this.LinkButtonCreated = true; 
      this.LinkButtonCommandArgument = commandArgument; 
      this.CreateLinkButton(commandArgument); 
     } 
    } 

    private void CreateLinkButton(string commandArgument) 
    { 
     LinkButton linkButton = 
      new LinkButton 
      { 
       ID = "linkButton", 
       Text = "Click me", 
       CommandArgument = commandArgument, 
      }; 
     linkButton.Click += this.linkButton_Click; 
     this.placeHolder.Controls.Add(linkButton); 
    } 

    private void linkButton_Click(object sender, EventArgs e) 
    { 
     LinkButton linkButton = (LinkButton)sender; 
     linkButton.Text = "I was clicked! Argument: " + linkButton.CommandArgument; 
    } 
} 
+0

謝謝你,這看起來很有前途,但我該如何重新點擊按鈕時,基於輸入linkbuttons?我需要傳遞一個值給命令參數的鏈接按鈕,當我重新創建按鈕時該如何處理? – SelAromDotNet

+1

使用視圖狀態來保存任何你需要重新創建鏈接按鈕,如命令參數。查看我的更新答案的例子。 –

+0

我試着根據你的例子設置它,但是LoadViewState沒有觸發。我應該提到,這是在一個用戶控件而不是一個頁面(不確定是否重要)。但我在LoadViewState中放置了一個斷點,它永遠不會觸發......甚至在回發 – SelAromDotNet

相關問題