2011-01-07 62 views
2

我正在通過單擊LinkBut​​ton在頁面中創建動態文本框。LinkBut​​ton上的動態文本框單擊

但是,在此之後,如果提交頁面,我找不到動態創建的項目,因此無法將信息發送到數據庫。

protected void lbAddTag_Click(object sender, EventArgs e) 
{ 
    for (int i = 0; i < 3;i++) 
    { 
     CreateTextBox("txtTag-" + i.ToString()); 
    } 

} 

private void CreateTextBox(string ID) 
{ 
    TextBox txt = new TextBox(); 
    txt.ID = ID; 
    txt.Width = Unit.Pixel(300); 
    //txt.TextChanged += new EventHandler(OnTextChanged); 
    txt.AutoPostBack = false; 
    tagsPanel.Controls.Add(txt); 

    Literal lt = new Literal(); 
    lt.Text = "<br /><br />"; 
    tagsPanel.Controls.Add(lt); 
} 

如果我把:

foreach (Control c in tagsPanel.Controls) 
{ 
    if (c is TextBox) 
    { 
     lblError.Text += c.ClientID + " , "; 
    } 
} 

在lbAddTag_Click方法,我可以看到的項目,他們的存在,但如果我提交頁面,並嘗試在數據庫中沒有插入值.. 。

任何提示都非常感謝。

回答

1

如果您動態創建控件,則它們不會在提交時持久化到控件層次結構/視圖狀態。

檢查這篇文章:http://www.4guysfromrolla.com/articles/092904-1.aspx

我寧願有一個Repeater控件,然後保持在會話一個ArrayList和使用,作爲一個數據源到中繼器控制。當我想添加一行時,我寧願在會話中向ArrayList添加一行,然後重新綁定中繼器控件。 讓我知道你是否需要一個例子。

+0

感謝cybermate,我現在明白了。如果你能舉一個例子,那就太好了。我正在閱讀4guysfromrolla文章 – 2011-01-07 21:12:19

+0

我已經在pastebin上發佈了一個粗略樣本。檢查這個URL:http://pastebin.com/dwqHDTUC – Chandu 2011-01-07 21:28:05

1

頁面生命週期的東西在ASP.NET中非常棘手。您需要確保LinkBut​​tons在生命週期嘗試加載其視圖狀態之前以相同方式創建。這樣做的最好方法是設置控件/頁面,以便在保存ViewState時,首先將有關您創建的文本框的信息添加到ViewState中。然後,在加載ViewState後立即根據該信息創建文本框。你可以通過覆蓋SaveViewState和LoadViewState方法來做到這一點。

1

您必須在Postback上重新創建每個動態控件,否則它們的值不能從ViewState重建。所以你需要保存你的文本框的計數(f.e.作爲ViewState變量)。他們需要得到相同的ID,所以你應該使用計數器作爲ID後綴(f.e。TextBox_4)。

1

Controls集合是一個樹結構。控件包含其他控件,因此它可能有1個Panel控件,其中包含其他幾個Panel,幷包含您正在查找的TextBox。你必須遞歸地通過控件。

看這個http://msdn.microsoft.com/en-us/library/486wc64h.aspx

或者這樣:

public delegate void control_visitor(Control control); 

public void iterate_controls(ControlCollection controls, control_visitor visitor) 
{ 
    foreach (Control control in controls) 
    { 
     visitor(control); 
     iterate_controls(control.Controls, visitor); 
    } 
} 
相關問題