Asp.net 尝试访问文本框时,文本框值为null namespace Dynamic\u Controls.Dropdowndynamic { 公共部分类DropdowndynamicUserControl:UserControl { 受保护的无效页面加载(对象发送方、事件参数e) { 如果(控制计数!=0) { 重新创建控件(); } } 私有void重新创建控件() { //创建文本框(ControlCount); 创建文本框(2); } 受保护的void CreateTextBox(int-ControlCount) { DynPanel.Visible=true; 对于(int i=0;i

Asp.net 尝试访问文本框时,文本框值为null namespace Dynamic\u Controls.Dropdowndynamic { 公共部分类DropdowndynamicUserControl:UserControl { 受保护的无效页面加载(对象发送方、事件参数e) { 如果(控制计数!=0) { 重新创建控件(); } } 私有void重新创建控件() { //创建文本框(ControlCount); 创建文本框(2); } 受保护的void CreateTextBox(int-ControlCount) { DynPanel.Visible=true; 对于(int i=0;i,asp.net,Asp.net,您是否在Page\u Load中动态添加这些控件(我假设,通过调用您的AddRequiredControl()方法)?如果是这样,它是否被包装在一个检查IsPostBack的条件中?可能的罪魁祸首是,在到达按钮单击处理程序之前,您正在用控件破坏性地重新填充页面,因此所有控件都将存在,但为空(与页面的初始加载一样) 另外,请注意,如果要在循环中将每个控件存储在\u txt中,为什么不引用该变量而不是在每行上重新转换。循环中的代码似乎做了很多工作,但回报很少。您需要在页面加载时或之前重新创建任何动态

您是否在
Page\u Load
中动态添加这些控件(我假设,通过调用您的
AddRequiredControl()
方法)?如果是这样,它是否被包装在一个检查
IsPostBack
的条件中?可能的罪魁祸首是,在到达按钮单击处理程序之前,您正在用控件破坏性地重新填充页面,因此所有控件都将存在,但为空(与页面的初始加载一样)


另外,请注意,如果要在循环中将每个控件存储在
\u txt
中,为什么不引用该变量而不是在每行上重新转换。循环中的代码似乎做了很多工作,但回报很少。

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

我不完全清楚
DropdownList
changed上发生了什么-您是否试图保留根据先前生成的文本框已经输入的内容

在任何情况下(没有双关语),您都需要在
Page\u Load
中或之前重新创建与回发中存在的文本框完全相同的文本框,否则就不会有数据

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

编辑-我现在不知道你的代码是如何工作的,你有带参数的
AddRequiredControl
,但你没有参数调用它。假设你有一个函数
AddRequiredControls
,它为给定的
DropDownList1
值创建所有文本框,并且有以下签名:

void AddRequiredControls(int index)

我们还假设您有一个名为
ControlsPlaceholder
占位符,它将包含文本框。下面是一些伪代码:

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"; 
    }
}

我没有调用AddRequiredControl()方法在PageLoad上,第一次仅在DropDownList选择更改时调用它。请帮助我访问每个已更改的文本框的值loaded@Janet:我刚才注意到一些我之前应该很清楚的事情……在按钮单击处理程序中调用该方法的位置如何?当你单击按钮时,你要做的第一件事就是s重新填充所有控件。然后立即获得它们的值。好吧,它们是刚刚创建的。因此它们的值将为空。为什么要在单击按钮时重新填充控件?另外,为什么方法有参数,但对它的调用没有参数?您实际调用的是什么?David,我已经发布了几乎所有的德,你能指导我检索用户在数据库中输入的值吗textboxes@Janet:是的,你已经发布了很多代码。我相当确定这并不都是相关的。作为一个基本的调试实践,你要做的一件事是尝试使用尽可能少的代码重新创建问题。这是一个巨大的挑战现在,我不打算尝试自己重新创建它并在调试器中逐步完成它。老实说,你可以这样做。不管怎样,我仍然怀疑你如何调用
CreateRequiredDynamicControls()
在单击事件中访问动态控件之前。我粘贴了整个代码,只是为了显示createRequiredDynamicControls中还有两个其他方法,以及控件是如何生成的。我尝试在additem click事件中不调用createRequiredDynamicControls方法,但如果我不这样做,控件将不再是在页面的这里。我试图使用上面粘贴的pseodo代码,但它不起作用,可能是我缺少了一些东西。我已经粘贴了几乎80%的代码。请检查它,让我知道你提到的上述方法是正确的。请hlp,因为我需要明天提交此文件。非常迫切的,你需要做的是更改
CreateRequiredDynamicControls
接受用于确定创建哪些控件的数据作为参数,这些数据类似于
ddlChargeCategory
ddlChargeCode
,并将它们存储在viewstate中,如上文所示,只要它们发生更改,然后使用viewstate中的值调用该函数,如示例所示。然后清除con当某些内容发生更改时,使用当前值trols并再次调用它。然后OnLoad方法将获取用户从文本框中输入的值,是吗?只要文本框在OnLoad之前已重新创建,与回发时相同,则为yes。protected override void LoadViewState(object savedState){base.LoadViewState(savedState);如果ViewState[“olddropdownindex”!=null){CreateRequiredDynamicControls((int)ViewState[“olddropdownindex”];}}如果我这样做,它会抛出一个错误CreateRequiredDynamicControls方法的重载不会接受1个参数,因为该方法没有参数
override void LoadViewState(..) {
    base.LoadViewState(..);
    if (ViewState["oldDropDownIndex"]!=null) {
        AddRequiredControls((int)ViewState["oldDropDownIndex"]);
    }
}

override OnLoad(EventArgs e) 
{
    // process data from textboxes    
}

void DropDownList1_SelectedIndexChanged(..) {
    ControlsPlaceholder.Controls.Clear();
    AddRequiredControls(DropDownList1.SelectedIndex);
    ViewState["oldDropDownIndex"]=DropDownList1.SelectedIndex;
}