2012-03-23 59 views
0

HTML獲取運行時添加的對照

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 
    <asp:Button runat="server" ID="show" OnClick="show_Click" Text="show"/> 
    <asp:Button runat="server" ID="add" OnClick="add_Click" Text="add new "/> 
    <div id="content" runat="server"></div> 
</asp:Content> 

代碼

protected void show_Click(object sender, EventArgs e) 
{ 
    Response.Write(((CheckBox) content.FindControl("chb")).Checked); 
} 
protected void add_Click(object sender, EventArgs e) 
{ 
    CheckBox chb = new CheckBox(); 
    chb.ID = "chb"; 
    chb.Text = "chb"; 
    content.Controls.Add(chb); 

} 

通過按鈕add上運行時增加了一個新checkbox的值。

然後我想通過按鈕show

((CheckBox) content.FindControl("chb")).Checked返回NULL獲取複選框chb

我想動態地添加複選框,然後檢查其中哪些檢查是真實的。

回答

0

您的活動不會發生在您頁面的同一回發中 - 當您單擊add時,它會添加複選框,但頁面執行完成後,頁面會發送到客戶端,並且完成處理該事件。

然後,當您單擊show按鈕時,這是另一個回發,您的複選框尚未創建,因此它不存在。

爲了解決這個問題,你有幾種選擇:

1. 複選框添加到頁面的設計和它的屬性Visible設置inially到false。您可以保留add按鈕,但實際上並不會在該頁面上添加複選框,只需將Visible設置爲true即可。

2. 如果您確實想要動態添加複選框,那麼您需要在每次執行頁面時在頁面事件處理程序之一(例如Load)中添加它。要做到這一點的方法是,當您點擊add並根據該值在視圖狀態或隱藏字段中保存值時,您將在隨後的回發中創建複選框。

protected void Page_Load (object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     if (Session["chb"] != null) 
      CreateChb(); 
    } 
} 
protected void show_Click(object sender, EventArgs e) 
{ 
    Response.Write(((CheckBox) content.FindControl("chb")).Text); 
} 
protected void add_Click(object sender, EventArgs e) 
{ 
    Session["chk"] = true; 
    CreateChb(); 
} 
private void CreateChb() 
{ 
    CheckBox chb = new CheckBox(); 
    chb.ID = "chb"; 
    chb.Text = "chb"; 
    content.Controls.Add(chb); 
} 
+0

我想動態,然後添加選中複選框如果你想保持複選框的狀態,你會好得多創建在設計CheckBox控件和顯示它是其中哪些檢查是真的 – user1263390 2012-03-23 09:13:07

+0

/需要時隱藏它。你可以動態地做到這一點,但你必須基本上保留動態控制的狀態,這將是很多工作。如果您計劃動態添加多個控件,則必須爲所有這些控件執行此操作。爲什麼要動態添加控件? – xxbbcc 2012-03-23 09:18:19

+0

如果你真的打算以這種方式向頁面添加100個複選框,那麼你需要一些認真的工作 - 除非你確實需要這樣做,否則這是錯誤的方法。 – xxbbcc 2012-03-23 10:04:19

0

發生這種情況是因爲動態添加的控件在回發後未保留。您可以通過向頁面添加另一個按鈕(無需單擊事件處理程序)來輕鬆演示此功能。運行應用程序並點擊「添加」按鈕創建複選框,然後點擊新添加的按鈕,複選框將在回發後消失。

0

嗯,我不明白你試圖達到什麼,但;

protected void show_Click(object sender, EventArgs e) 
    {    
     Response.Write((Session["chb"] as CheckBox).Text); 
    } 
    protected void add_Click(object sender, EventArgs e) 
    { 
     CheckBox chb = new CheckBox(); 
     chb.ID = "chb"; 
     chb.Text = "chb"; 
     content.Controls.Add(chb); 
     Session["chb"] = chb; 

    } 
+0

你的例子有效,但我認爲在會話中保留控件是一個不錯的主意。(雖然我個人不認爲這是一個好主意,動態添加控件,而不是在幾個場景:)) – xxbbcc 2012-03-23 09:20:47

+0

如果我有2000用戶和100複選框,每個用戶然後內存????????? – user1263390 2012-03-23 09:29:32

+0

@xxbbcc你是對的,但正如我在答覆中所說的,我不明白其目的。 – daryal 2012-03-23 09:30:49