【问题标题】:Dynamically created controls lose values动态创建的控件丢失值
【发布时间】:2013-06-20 17:14:21
【问题描述】:

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

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

我可以使用以下方法在 PostBack 上找到这些动态控件并访问它们的值:

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

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

如果我尝试引用复选框而不重新创建它们,我当然会收到“未设置对象引用...”错误。所以我需要一些方法来在用户输入的值被清除之前捕获它们。

建议?

【问题讨论】:

    标签: c# postback dynamic-controls


    【解决方案1】:

    您必须在 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];

    【讨论】:

    • 谢谢,@matt-dot-net。你能解释一下 FindControl 的替代方案吗?我不确定你所说的私有成员变量是什么意思。
    • 顺便说一句,我设置它以便在 Page_Init 中调用函数 BuildControls,而不管 PostBack。尝试保存用户更改时,“对象引用”错误仍然存​​在。如果我从 SaveChanges 事件中调用 BuildControls,我会通过它,但会收到一条错误消息,指出多个控件具有相同的 ID,显然因为 BuildControls 也在 Page_Init 中。
    • 那个字典的想法是我一直在寻找的灵丹妙药。谢谢,@matt-dot-net!
    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多