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