我试图在运行时动态添加文本框并在SQL Server中保存数据。我能够生成一个文本框,但我无法将数据发送到数据库,也没有发出任何错误。我究竟做错了什么?
这是我的代码:
<asp:Panel ID="Panel1" runat="server"></asp:Panel>
<asp:Button ID="btnAddCtrl" runat="server" Text="Add New Field" OnClick="btnAddCtrl_Click" />
<asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" />
这是我的cs代码
protected void btnAddCtrl_Click(object sender, EventArgs e)
{
int rowCount = 0;
//initialize a session.
rowCount = Convert.ToInt32(Session["clicks"]);
rowCount++;
//In each button clic save the numbers into the session.
Session["clicks"] = rowCount;
//Create the textboxes and labels each time the button is clicked.
for (int i = 0; i < rowCount; i++)
{
TextBox TxtBoxU = new TextBox();
//TextBox TxtBoxE = new TextBox();
Label lblU = new Label();
//Label lblE = new Label();
TxtBoxU.ID = "TextBoxU" + i.ToString();
//TxtBoxE.ID = "TextBoxE" + i.ToString();
lblU.ID = "LabelU" + i.ToString();
//lblE.ID = "LabelE" + i.ToString();
lblU.Text = "User " + (i + 1).ToString() + " : ";
//lblE.Text = "E-Mail : ";
//Add the labels and textboxes to the Panel.
Panel1.Controls.Add(lblU);
Panel1.Controls.Add(TxtBoxU);
Panel1.Controls.Add(new LiteralControl("<br/>"));
Panel1.Controls.Add(new LiteralControl("<br/>"));
}
}
protected void btnSave_Click(object sender, EventArgs e)
{
foreach (TextBox textBox in Panel1.Controls.OfType<TextBox>())
{
string constr = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO AssetsDetail (FieldName) VALUES(@FieldName)",con))
{
cmd.Connection = con;
cmd.Parameters.AddWithValue("@FieldName", textBox.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}
}
}
答案 0 :(得分:0)
由于动态控件不是标记的一部分,因此需要在每次页面加载时以编程方式将它们添加到控件树中,之后它们将在HTML响应中呈现回来。
在这种情况下,您不会在Save Click引起的PostBack上添加控件。因此,控件不是控制树的一部分,Panel1.Controls.OfType<TextBox>()
计数将始终为零。事实上,文本框甚至不会在SaveClick回发后呈现。
您需要在每个回发中添加&#34;添加动态控件的代码&#34;(&#39; rowcount&#39;增量除外),以便{{1}中可以使用TextBoxes }和文本框&#39;文字&#39;将出席。
Panel1.Controls.OfType<TextBox>()
答案 1 :(得分:0)
为了在PostBacks中保留动态TextBox,我们需要使用Page的PreInit事件来使用Request.Form集合重新创建动态TextBox。 首先获取包含字符串TextBoxU的所有键,然后为每个键调用btnAddCtrl_Click事件。
protected void Page_PreInit(object sender, EventArgs e)
{
List<string> keys = Request.Form.AllKeys.Where(key => key.Contains("TextBoxU")).ToList();
int i = 0;
foreach (string key in keys)
{
this.CreateTextBox("TextBoxU" + i);
i++;
}
}