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

编辑GridView行时如何解密BoundField值并显示在TextBox中?

解决GridView编辑行时解密BoundField字段的问题

我之前也碰到过类似的坑,你说的Cells集合在编辑状态下"为空"其实是误解——编辑状态下BoundField会被自动渲染成TextBox控件,而不是静态文本,所以直接访问Cells的Text肯定拿不到东西,得找到对应的TextBox来赋值才行。

给你整理一下具体的实现步骤和代码:

核心思路

  1. 在RowDataBound事件中,先判断当前行是数据行且处于编辑状态;
  2. 通过DataRowView获取数据源中的加密原始值;
  3. 调用你的解密方法处理原始值;
  4. 找到编辑状态下对应列的TextBox控件,把解密后的值赋给它。

完整代码示例

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // 只处理数据行,忽略表头、页脚等行
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // 判断当前行是否处于编辑状态(注意要用位运算,因为RowState可能是混合状态)
        if ((e.Row.RowState & DataControlRowState.Edit) != 0)
        {
            // 获取绑定的数据源行
            DataRowView drv = e.Row.DataItem as DataRowView;
            if (drv != null)
            {
                // 从数据源拿到加密后的原始值
                string encryptedValue = drv["encrypted"].ToString();
                
                // 调用你的解密方法,替换成你实际的解密逻辑
                string decryptedValue = YourDecryptionMethod(encryptedValue);

                // 找到"Secret"列对应的TextBox控件
                // 方法1:硬编码列索引(如果列位置固定的话)
                // int secretColIndex = 2; // 替换成你实际的列索引(从0开始)
                
                // 方法2:通过HeaderText动态找索引(更灵活,列位置变了也不用改代码)
                int secretColIndex = -1;
                GridView gv = sender as GridView;
                if (gv != null)
                {
                    for (int i = 0; i < gv.Columns.Count; i++)
                    {
                        if (gv.Columns[i].HeaderText == "Secret")
                        {
                            secretColIndex = i;
                            break;
                        }
                    }
                }

                if (secretColIndex != -1)
                {
                    // 获取列中的TextBox控件(编辑状态下BoundField生成的第一个控件就是TextBox)
                    TextBox txtSecret = e.Row.Cells[secretColIndex].Controls[0] as TextBox;
                    if (txtSecret != null)
                    {
                        txtSecret.Text = decryptedValue;
                    }
                }
            }
        }
    }
}

// 示例解密方法,替换成你实际的实现
private string YourDecryptionMethod(string encryptedText)
{
    // 这里写你的解密逻辑,比如对称解密、非对称解密等
    // 示例:假设是简单的反转字符串(实际项目不要这么干!)
    char[] charArray = encryptedText.ToCharArray();
    Array.Reverse(charArray);
    return new string(charArray);
}

关键说明

  • 为什么不用Cells[xxx].Text?因为编辑状态下,BoundField的渲染结果是一个<input type="text">(也就是TextBox),单元格的Text属性不再存储显示值,所有内容都在TextBox里;
  • 位运算判断编辑状态:RowState可能同时包含Edit和Alternate等状态,所以必须用&位运算来判断,不能直接用==;
  • 动态找列索引的好处:如果后续调整GridView的列顺序,不用手动修改代码里的索引值,更健壮。

内容的提问来源于stack exchange,提问作者Joep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:27:30