动态创建的控件会丢失值

本文关键字:控件 创建 动态 | 更新日期: 2023-09-27 18:19:19

ASP.NET 4.0. 我想允许用户查看/编辑客户许可证上的项目。 许可证包含 1-M 产品,产品列表将随着时间的推移而扩展,因此我动态创建所有产品的列表(Page_Load(,并带有一个复选框来说明许可证是否具有该产品,如下所示:

CheckBox cbxProduct = new CheckBox();
cbxProduct.ID = "cbxProduct" + product.ID.ToString();

我可以使用以下命令找到这些动态控件并在回发上访问它们的值:

CheckBox cbxProd = (CheckBox)pnlLicenseDetails.FindControl("cbxProduct" + productID.ToString());

但前提是它们刚刚在Page_Load(或Page_Init中重新创建,似乎无关紧要(。 问题是我希望用户能够取消选中一个框以从许可证中删除产品,然后保存结果。 但是为了找到复选框并确定其值,我必须重新创建控件,这当然会擦除用户输入的任何值。

如果我尝试引用复选框而不重新创建它们,我当然会得到"未设置对象引用..."错误。 因此,我需要一些方法来捕获用户输入的值,然后再将其清除。

建议?

动态创建的控件会丢失值

您必须在Page_Init中创建动态控件。 您必须为所有请求以相同的方式创建它们。 这意味着,运行相同的代码来创建控件,并在每次加载页面时将其添加到控件集合中,而不管是否为 IsPostBack。

此外,我建议您将动态控件的实例保存到私有成员变量中,这样您就不必调用FindControl,因为这可能会很昂贵。

由于看起来您在某处有一个产品列表,因此下面是一个使用字典存储复选框的示例:

public partial class _Default : Page
{
    private Dictionary<Int32,CheckBox> _myDynamicCheckBoxes;
    protected override void OnInit(EventArgs e)
    {
        _myDynamicCheckBoxes = new Dictionary<Int32,CheckBox>();
        foreach (var product in _listOfProducts)
        {
            var chkBox = new CheckBox {ID = "CheckBox" + product.ID.ToString()};
            _myDynamicCheckBoxes.Add(product.ID,chkBox);
            //add the checkbox to a Controls collection
        }
    }
}

然后在代码中的其他地方,当您有一个产品并且想要查找关联的复选框时,您可以使用:var aCheckBox = _myDynamicCheckBoxes[product.ID];