【问题标题】:Dynamic TextBox on LinkButton clickLinkBut​​ton 上的动态文本框单击
【发布时间】:2011-06-05 12:44:52
【问题描述】:

我通过单击链接按钮在页面中创建动态文本框。

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

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 方法中,我可以看到项目,并且它们存在,但是如果我提交页面并尝试在数据库中插入值什么...

非常感谢任何提示。

【问题讨论】:

    标签: c# asp.net textbox linkbutton


    【解决方案1】:

    如果您动态创建控件,它们不会在提交时保留到控件层次结构/视图状态中。

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

    我宁愿有一个中继器控件,然后在会话中维护一个 ArrayList 并将其用作中继器控件的数据源。当我想添加一行时,我宁愿在会话中向 ArrayList 添加一行并重新绑定转发器控件。 如果您需要示例,请告诉我。

    【讨论】:

    • 谢谢cybermate,我现在明白了。如果你能举个例子那就太好了。我正在阅读 4guysfromrolla 的帖子
    • 我在 pastebin 发布了一个粗略的样本。检查此网址:pastebin.com/dwqHDTUC
    • 嗨 Cyber​​mante,我已经添加了它,它运行良好。非常感谢。
    【解决方案2】:

    页面生命周期的东西在 ASP.NET 中确实很棘手。您需要确保在生命周期尝试加载其视图状态之前以相同的方式创建 LinkBut​​ton。最好的方法可能是设置您的控件/页面,以便在保存 ViewState 时,它​​首先将有关您创建的文本框的信息添加到 ViewState。然后,在加载 ViewState 后立即根据该信息创建文本框。您可以通过重写 SaveViewState 和 LoadViewState 方法来做到这一点。

    【讨论】:

      【解决方案3】:

      您必须在 Postback 上重新创建每个动态控件,否则无法从 ViewState 重新构建它们的值。因此,您需要保存文本框的数量(例如,作为 ViewState 变量)。他们需要获得相同的 id,因此您应该使用计数器作为 ID 的后缀(例如 TextBox_4)。

      【讨论】:

        【解决方案4】:

        控件集合是一个树形结构。控件包含其他控件,因此它可能有 1 个 Panel 控件,其中包含几个其他 Panels 和那些包含您正在寻找的 TextBoxes。您必须递归地遍历控件。

        看看这个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);
            }
        }
        

        【讨论】:

        • 嗨扎克。我的问题与迭代控件无关。我了解这是如何完成的并且做到了。问题是我提交页面后控件不会在视图状态中持续存在。谢谢亚历克斯
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多