2015-10-16 174 views
0

我正在以編程方式將面板添加到另一個面板(我稱這些面板塊爲更好理解)。每個塊都包含一個標題,一個用於向塊添加文本框的按鈕和一個起始文本框。動態添加文本框以動態添加面板

這是我使用添加文本框的事件:

/// <summary> 
/// Adds a text box to the button's parent 
/// </summary> 
protected void AddLabel_Click(object sender, EventArgs e) 
{ 
    Button senderButton = (Button)sender; 
    string parentId = senderButton.ID.Replace("_button",""); 
    Panel parent = (Panel)FindControl(update_panel, parentId); 

    parent.Controls.Add(new TextBox 
    { 
     CssClass = "form-control canvas-label", 
     ID = parent.ID + "_label" + parent.Controls.OfType<TextBox>().Count<TextBox>() 
    }); 
} 

然而,我每次添加一個文本框,我剛剛創建被刪除

編輯這是怎樣的一個我最終解決它(感謝唐):

1)保持文本框列表

Dictionary<string, List<string>> BlocksLabels 
{ 
    get 
    { 
     if (ViewState["BlockLabels"] == null) 
      ViewState["BlockLabels"] = new Dictionary<string, List<string>>(); 

     return ViewState["BlockLabels"] as Dictionary<string, List<string>>; 
    } 
    set { ViewState["BlockLabels"] = value; } 
} 

2)在創建該塊的方法(從的Page_Load調用):

if (BlocksLabels.ContainsKey(block.ID)) 
{ 
    foreach (string label in BlocksLabels[block.ID]) 
     block.Controls.Add(new TextBox { ID = labelId }); 
} 
else 
{ 
    // Add one empty canvas label by default 
    string labelId = block.ID + "_label0"; 
    BlocksLabels[block.ID] = new List<string>(); 
    BlocksLabels[block.ID].Add(labelId); 
    block.Controls.Add(new TextBox { ID = labelId }); 
} 

3)最後,在增加了一個新的文本框

Button senderButton = (Button)sender; 
string parentId = senderButton.ID.Replace("_button", ""); 
Panel targetBlock = (Panel)FindControl(update_panel, parentId); 

string labelId = targetBlock.ID + "_label" + BlocksLabels[targetBlock.ID].Count; 
BlocksLabels[targetBlock.ID].Add(labelId); 
targetBlock.Controls.Add(new TextBox { ID = labelId }); 

回答

1

在ASP.NET的情況下,如果以編程方式創建控件,則需要在回發期間再次重新創建該控件。

因此,您的解決方案將存儲所創建控件的ID列表,並在回發期間(最好在頁面加載事件中)重新創建它們。

這對頁面控件樹與存儲的視圖狀態保持一致是必需的。

+0

那與動態控制工作時是真正的痛苦。 – niksofteng

+0

嗨,謝謝你的回答。什麼是正確/最好的方式來存儲? –

+0

我會將它存儲在List或Array中並將其存儲在ViewState中。通過這種方式,列表/數組在回發期間可用 – Don

1

請參見下面的代碼:

<asp:HiddenField runat="server" ID="hdnTbCnt" Value="0" /> 
<asp:Panel runat="server" ID="panel1"> 
</asp:Panel> 
<asp:Button Text="Add TextBox" runat="server" OnClick="AddTextBox_Click" /> 

代碼隱藏:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     int tbCnt = Convert.ToInt32(hdnTbCnt.Value); 

     for (int i = 1; i <= tbCnt; i++) 
     { 
      var tb = new TextBox() 
      { 
       ID = string.Format("txt{0}", i) 
      }; 

      panel1.Controls.Add(tb); 
     } 
    } 
} 

protected void AddTextBox_Click(object sender, EventArgs e) 
{ 
    int tbCount = Convert.ToInt32(hdnTbCnt.Value); 

    var tb = new TextBox() 
    { 
     ID = string.Format("txt{0}", tbCount + 1) 
    }; 

    panel1.Controls.Add(tb); 

    hdnTbCnt.Value = (tbCount + 1).ToString(); 
} 
+0

您在aspx中有HiddenField和Panel,但我需要動態生成這些 –

+0

如果我們想要有一個removetextbox事件,該怎麼辦?我們希望看到你的表現如何......比如你是否會減少tbcount值..如何刪除特定的文本框...... –