RadGrid插入时FindControl获取RadTextBox返回null如何获取字段值
Telerik RadGrid 插入事件获取GridBoundColumn输入值方案
问题场景
现有用于展示评论的Telerik RadGrid网格,其中评论列GridBoundColumn配置如下:
<telerik:GridBoundColumn DataField="Comment" UniqueName="Comment" HeaderText="Comment" HeaderStyle-HorizontalAlign="Center" ItemStyle-Width="170px" HeaderStyle-Width="105px"> </telerik:GridBoundColumn>
业务中已捕获OnInsertCommand事件处理新增评论逻辑,初始事件处理代码如下:
protected void rgvComments_OnInsertCommand(object sender, GridCommandEventArgs e) { clsShortageComment thisClass = new clsShortageComment(); GridEditableItem editableItem = (GridEditableItem)e.Item; Hashtable values = new Hashtable(); editableItem.ExtractValues(values); RadTextBox theBox = editableItem.FindControl("Comment") as RadTextBox; thisClass.Comment = theBox.Text; thisClass.Employee = rtbEmployee.Text; thisClass.Active = true; thisClass.MaterialReq = Convert.ToInt32(rlbMaterial.SelectedItem.Value); thisClass.InsertRecord(); }
运行时出现异常:调用FindControl方法查找Comment字段对应的RadTextBox控件时返回null,但ExtractValues生成的哈希表中可以正常看到Comment字段的键值。
问题原因
FindControl返回null是两个写法错误导致的:
- 直接在
GridEditableItem层级按列名查找控件,但GridBoundColumn自动生成的编辑输入控件是放在对应列的单元格内部,不属于Item的直接子控件 - 自动生成的RadTextBox控件ID并不是列的UniqueName("Comment"),默认自动生成的ID是框架管控的固定值,硬编码列名自然找不到匹配控件
正确实现方式
优先选择最稳定的方案,直接复用已经提取完成的哈希表取值即可,完全不需要查找控件:
protected void rgvComments_OnInsertCommand(object sender, GridCommandEventArgs e) { clsShortageComment thisClass = new clsShortageComment(); GridEditableItem editableItem = (GridEditableItem)e.Item; Hashtable values = new Hashtable(); editableItem.ExtractValues(values); // 直接从哈希表按列名取值,不需要查找控件 thisClass.Comment = values["Comment"]?.ToString().Trim(); thisClass.Employee = rtbEmployee.Text; thisClass.Active = true; thisClass.MaterialReq = Convert.ToInt32(rlbMaterial.SelectedItem.Value); thisClass.InsertRecord(); }
如果有特殊场景必须获取RadTextBox控件实例,需要先定位到Comment列对应的单元格,再在单元格范围内查找控件:
// 先通过列UniqueName定位到对应单元格 TableCell commentColumnCell = editableItem["Comment"]; // 从单元格内查找自动生成的RadTextBox RadTextBox commentTextBox = commentColumnCell.Controls[0] as RadTextBox; if(commentTextBox != null) { thisClass.Comment = commentTextBox.Text.Trim(); }
不推荐硬编码控件ID查找的方式,不同Telerik版本自动生成的控件ID可能存在差异,用哈希表取值的方式兼容性最好,代码也更简洁。
内容的提问来源于stack exchange,提问作者Bernie Hunt
相关产品推荐
相关产品推荐

