点击链接按钮时动态文本框

11 浏览
0 Comments

点击链接按钮时动态文本框

我通过点击LinkButton在页面上创建动态的TextBoxes。

然而,在此之后,如果页面被提交,我无法找到动态创建的项目,因此无法将信息发送到数据库。

在lbAddTag_Click方法中加入以下代码:

foreach (Control c in tagsPanel.Controls)

{

if (c is TextBox)

{

lblError.Text += c.ClientID + " , ";

}

}

我可以看到这些项目,并且它们存在,但是如果我提交页面并尝试将值插入数据库,什么都没有发生...

非常感谢任何提示。

0
0 Comments

原因:在ASP.NET中,页面的生命周期非常复杂。在生命周期试图加载视图状态之前,需要确保LinkButtons以相同的方式创建。最好的方法可能是设置控件/页面,使其在保存视图状态时,首先将已创建的文本框的信息添加到视图状态中。然后,在加载视图状态后立即根据该信息创建文本框。可以通过重写SaveViewState和LoadViewState方法来实现这一点。

解决方法:

protected override object SaveViewState()

{

// 添加文本框信息到视图状态

ViewState["TextBoxCount"] = textBoxList.Count;

for (int i = 0; i < textBoxList.Count; i++)

{

ViewState["TextBoxText" + i] = textBoxList[i].Text;

}

return base.SaveViewState();

}

protected override void LoadViewState(object savedState)

{

base.LoadViewState(savedState);

// 根据视图状态创建文本框

int textBoxCount = (int)ViewState["TextBoxCount"];

for (int i = 0; i < textBoxCount; i++)

{

TextBox textBox = new TextBox();

textBox.Text = (string)ViewState["TextBoxText" + i];

textBoxList.Add(textBox);

// 将文本框添加到页面或其他容器中

container.Controls.Add(textBox);

}

}

0
0 Comments

动态文本框在LinkButton点击时无法保存值的原因是,页面在回发时需要重新创建每个动态控件,否则无法从ViewState中重新构建它们的值。因此,需要保存文本框的数量(例如作为ViewState变量)。它们需要具有相同的ID,因此应该使用计数器作为ID的后缀(例如TextBox_4)。

解决方法是,在页面回发时重新创建动态文本框,并为其分配相同的ID。可以使用ViewState变量来保存文本框的数量,并在回发时使用该数量来创建相应数量的文本框。以下是一个示例代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        ViewState["TextBoxCount"] = 0;
    }
    else
    {
        int textBoxCount = (int)ViewState["TextBoxCount"];
        for (int i = 0; i < textBoxCount; i++)
        {
            TextBox textBox = new TextBox();
            textBox.ID = "TextBox_" + i;
            PlaceHolder1.Controls.Add(textBox);
        }
    }
}
protected void LinkButton1_Click(object sender, EventArgs e)
{
    int textBoxCount = (int)ViewState["TextBoxCount"];
    TextBox textBox = new TextBox();
    textBox.ID = "TextBox_" + textBoxCount;
    PlaceHolder1.Controls.Add(textBox);
    ViewState["TextBoxCount"] = textBoxCount + 1;
}

在上述代码中,Page_Load事件用于重新创建动态文本框。如果页面不是回发,则将TextBoxCount设置为0。如果页面是回发,则使用TextBoxCount的值来创建相应数量的文本框。LinkButton1_Click事件用于在LinkButton点击时创建新的动态文本框,并将TextBoxCount增加1。

通过以上的解决方法,可以实现在LinkButton点击时创建动态文本框,并在回发时正确地保存和重建其值。

0