You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:21:22