gpt4 book ai didi

c# - ASP.NET 动态控件计数(随手创建控件)

转载 作者:太空狗 更新时间:2023-10-29 23:34:35 25 4
gpt4 key购买 nike

我正在尝试创建一个复合 ASP.NET 控件,让您构建一个可编辑的控件集合。

我的问题是,当我按下添加或回发按钮(除了回发表单外什么都不做)时,在文本框中输入的任何值都将丢失。

当回发之间的控件数量发生变化时,我无法让它工作。我基本上需要能够根据 View 状态属性 ControlCount 在控件生命周期的两个不同时间重新创建控件树。

此测试可用于重现问题:

public class AddManyControl : CompositeControl
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
EnsureChildControls();
}

protected override void CreateChildControls()
{
var count = ViewState["ControlCount"] as int? ?? 0;

for (int i = 0; i < count; i++)
{
var div = new HtmlGenericControl("div");
var textBox = new TextBox();
textBox.ID = "tb" + i;
div.Controls.Add(textBox);
Controls.Add(div);
}

ViewState["ControlCount"] = count;

var btnAdd = new Button();
btnAdd.ID = "Add";
btnAdd.Text = "Add text box";
btnAdd.Click += new EventHandler(btnAdd_Click);
Controls.Add(btnAdd);

var btnPostBack = new Button();
btnPostBack.ID = "PostBack";
btnPostBack.Text = "Do PostBack";
Controls.Add(btnPostBack);
}

void btnAdd_Click(object sender, EventArgs e)
{
ViewState["ControlCount"] = (int)ViewState["ControlCount"] + 1;
}

protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
// If I remove this RecreateChildControls call
// the collection lags behind each postback
// because the count is incremented in the btnAdd_Click event handler
// however, the values are not lost between postbacks
RecreateChildControls();
}
}

最佳答案

如果您想使用 ASP.NET 的自定义控件,您必须遵守它的规则和挑剔!当您开始在自定义控件中使用 OnPreRender 时,您知道 90% 的时间您都在错误的轨道上。

通常,使用 ViewState 的最佳方式是声明一个由它支持的属性,就像标准 ASP.NET 控件所做的那样(.NET Reflector 多年来一直是我的老师!)。这样,它将在事件的生命周期内自然地被读取和保存。

下面是一段代码,似乎可以很自然地执行您想要的操作,没有任何技巧:

public class AddManyControl : CompositeControl
{
private void AddControl(int index)
{
var div = new HtmlGenericControl("div");
var textBox = new TextBox();
textBox.ID = "tb" + index;
div.Controls.Add(textBox);
Controls.AddAt(index, div);
}

protected override void CreateChildControls()
{
for (int i = 0; i < ControlsCount; i++)
{
AddControl(i);
}

var btnAdd = new Button();
btnAdd.ID = "Add";
btnAdd.Text = "Add text box";
btnAdd.Click += new EventHandler(btnAdd_Click);
Controls.Add(btnAdd);

var btnPostBack = new Button();
btnPostBack.ID = "PostBack";
btnPostBack.Text = "Do PostBack";
Controls.Add(btnPostBack);
}

private int ControlsCount
{
get
{
object o = ViewState["ControlCount"];
if (o != null)
return (int)o;

return 0;
}
set
{
ViewState["ControlCount"] = value;
}
}

void btnAdd_Click(object sender, EventArgs e)
{
int count = ControlsCount;
AddControl(count);
ControlsCount = count + 1;
}
}

关于c# - ASP.NET 动态控件计数(随手创建控件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4823428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com