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中重新创建它们,似乎并不重要)。问题是我希望用户能够取消选中一个框以从许可证中删除产品,然后保存结果。但是为了找到复选框并确定其值,我必须重新创建控件,这当然会删除用户输入的任何值。
如果我尝试引用复选框而不重新创建它们,我当然会得到“对象引用未设置...”错误。所以我需要一些方法来捕获用户输入之前输入的值。
建议?
答案 0 :(得分:0)
您必须在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];