如何判断RadGrid主/子表编辑状态及控制ItemDataBound触发时机
解决主/细节RadGrid中子表编辑触发主表ItemDataBound报错的问题
我之前也踩过主/细节RadGrid搭配RadComboBox自动补全的坑,给你分享几个实用的解决方案,核心就是精准区分当前编辑项属于主表还是子表:
方法一:通过ParentItem判断主/子表
每个子表的OwnerTableView都会关联一个ParentItem(即对应的主表行),而主表的ParentItem为null。利用这个特性,就能在ItemDataBound里过滤出主表的编辑项:
protected void RadGrid_MasterDetail_ItemDataBound(object sender, GridItemEventArgs e) { // 先确认当前项是编辑状态的可编辑项 if (e.Item is GridEditableItem editableItem && editableItem.IsInEditMode) { // 判断是否为主表的编辑项 if (editableItem.OwnerTableView.ParentItem == null) { // 在这里执行主表RadComboBox的自动补全逻辑 RadComboBox autoCompleteCombo = editableItem.FindControl("YourMasterComboID") as RadComboBox; if (autoCompleteCombo != null) { // 绑定自动补全数据源、启用按需加载等配置 autoCompleteCombo.DataSource = GetAutoCompleteDataSource(); autoCompleteCombo.DataTextField = "DisplayText"; autoCompleteCombo.DataValueField = "ValueID"; autoCompleteCombo.EnableAutomaticLoadOnDemand = true; autoCompleteCombo.DataBind(); } } // 子表的编辑项会自动跳过这段逻辑,避免报错 } }
方法二:通过TableView的Name属性区分
如果你已经给主表和子表的TableView设置了唯一的Name属性(比如主表设为"MasterTable",子表设为"DetailTable"),可以直接通过名称判断:
protected void RadGrid_MasterDetail_ItemDataBound(object sender, GridItemEventArgs e) { if (e.Item is GridEditableItem editableItem && editableItem.IsInEditMode) { // 只处理主表的编辑项 if (editableItem.OwnerTableView.Name == "MasterTable") { RadComboBox autoCompleteCombo = editableItem.FindControl("YourMasterComboID") as RadComboBox; // 配置自动补全逻辑... } } }
额外提示
子表编辑时触发主表ItemDataBound的原因是:主/细节结构下,子表状态变化会导致主表行重新绑定,若你的代码没有判断范围,就会尝试在错误的上下文(子表编辑时)查找主表的RadComboBox,最终引发报错。上面的两种方法都能有效规避这个问题,你可以根据自己的代码结构选择更顺手的一种。
内容的提问来源于stack exchange,提问作者Henry Lee
相关产品推荐
相关产品推荐

