尝试访问时,文本框值为null

时间:2011-04-03 16:56:06

标签: asp.net

namespace Dynamic_Controls.Dropdowndynamic
{
public partial class DropdowndynamicUserControl : UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (ControlCount != 0)
        {
            Recreatecontrols();
        }
    }

    private void Recreatecontrols()
    {
       // createtextboxes(ControlCount);
        createtextboxes(2);
    }

    protected void createtextboxes(int ControlCount)
    {
        DynPanel.Visible = true;
        for (int i = 0; i <= ControlCount; i++)
        {
            TextBox tb = new TextBox();
            tb.Width = 150;
            tb.Height = 18;
            tb.TextMode = TextBoxMode.SingleLine;
            tb.ID = "TextBoxID" + this.DynPanel.Controls.Count;
            tb.Text = "EnterTitle" + this.DynPanel.Controls.Count;
            tb.Load+=new EventHandler(tb_Load);
            tb.Visible = true;
            tb.EnableViewState = true;
            DynPanel.Controls.Add(tb);
            DynPanel.Controls.Add(new LiteralControl("<br/>"));

        }

    }

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Int32 newControlCount = Int32.Parse(DropDownList1.SelectedValue);
        //createtextboxes(newControlCount);
        //ControlCount+=newControlCount;
        createtextboxes(2);
    }

    protected void Button1_Click(object sender, EventArgs e)
    {

        readtextboxes();

    }

    public void readtextboxes()
    {
        string x = string.Empty;
        for (int a = 0; a < DynPanel.Controls.Count; a++)
        {
            foreach (Control ctrl in DynPanel.Controls)
            {
                if (ctrl is TextBox)
                {
                    x = ((TextBox)ctrl).Text;
                }
                x+=x+("\n");
            }

            Result.Text = x;
        }
    }

    private Int32 ControlCount
    {
        get
        {
            if (ViewState["ControlCount"] == null)
            {
                ViewState["ControlCount"] = 0;

            }
            return (Int32)ViewState["ControlCount"];
        }
        set
        {
           // ViewState["ControlCount"] = value;
            ViewState["ControlCount"] = 2;
        }
    }


    private void tb_Load(object sender, EventArgs e)
    {
        LblInfo.Text = ((TextBox)sender).ID + "entered"; 
    }
}

}

2 个答案:

答案 0 :(得分:0)

您是否在Page_Load中动态添加这些控件(我假设,调用您的AddRequiredControl()方法)?如果是这样,它是否包含在检查IsPostBack的条件中?可能的罪魁祸首是,在进入按钮单击处理程序之前,您正在破坏性地使用控件重新填充页面,因此所有控件都将存在但为空(如在页面的初始加载中)。

另外,只需注意,如果您将每个控件存储在循环中的_txt中,为什么不在每行上引用该变量而不是重新转换。循环中的代码似乎做了很多工作而几乎没有回报。

答案 1 :(得分:0)

您需要在 Page_Load之前或之前重新创建任何动态创建的控件,否则它们将不包含回发数据。

我并不完全清楚DropdownList上发生的变化 - 您是否尝试保留已根据之前生成的文本框输入的内容?

在任何情况下(没有双关语)你需要在回复中存在的Page_Load之前或之前重新创建完全相同的文本框,否则就不会有数据。

执行此操作的典型方法是在ViewState中保存您的代码可用于确定要重新创建的内容的内容 - 例如DropDownList上一个值。覆盖LoadViewState并调用其中的创建代码以捕获所需的值,创建文本框,然后在DropDownList更改事件中,删除可能在LoadViewState中创建的所有控件(当然,在处理他们的数据之后)并根据新值重新创建它们。

编辑 - 我无法弄清楚你的代码现在是如何工作的,你有AddRequiredControl参数,但是你没有参考。假设您有一个函数AddRequiredControls,它为给定的DropDownList1值创建所有文本框,并具有以下签名:

void AddRequiredControls(int index)

我们还假设您有一个名为PlaceHolder的{​​{1}},其中包含文本框。这是一些伪代码:

ControlsPlaceholder