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

Delphi Prism中读取GridView模板内绑定TextBox值至Session的问题

解决Delphi Prism中GridView模板控件无法访问的问题

核心问题原因

模板内的控件属于GridView的行级子控件,无法直接通过控件ID全局访问,必须先定位到选中的行,再从该行中查找目标控件。

步骤1:修改事件方法获取控件值

替换原代码,先获取选中的GridView行,再通过FindControl方法定位TextBox1:

method WebForm1.GridView1_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
var
  selectedRow: GridViewRow;
  txtCategory: TextBox;
begin
  // 获取当前选中行
  selectedRow := GridView1.SelectedRow;
  if selectedRow <> nil then
  begin
    // 在选中行内查找目标TextBox
    txtCategory := selectedRow.FindControl('TextBox1') as TextBox;
    if txtCategory <> nil then
    begin
      session["Category"] := txtCategory.Text;
    end;
  end;
end;

步骤2:确认GridView模板配置

你提到GridView没有ItemTemplate属性,仅存在EmptyDataTemplate,大概率是当前GridView处于自动生成列模式,而非自定义模板列。若要将TextBox置于模板中实现绑定,需手动添加TemplateField:

  1. 在GridView的列配置中新增TemplateField
  2. 在TemplateField的ItemTemplate或EditItemTemplate中放置TextBox1,并设置数据绑定(例如Text='<%# Bind("Category") %>')

如果无需自定义模板列,仅需遍历选中行的控件来定位TextBox:

method WebForm1.GridView1_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
var
  selectedRow: GridViewRow;
  txtCategory: TextBox;
  i: Integer;
begin
  selectedRow := GridView1.SelectedRow;
  if selectedRow <> nil then
  begin
    // 遍历行内控件查找目标TextBox
    for i := 0 to selectedRow.Controls.Count - 1 do
    begin
      if selectedRow.Controls[i] is TextBox then
      begin
        txtCategory := selectedRow.Controls[i] as TextBox;
        if txtCategory.ID = 'TextBox1' then
        begin
          session["Category"] := txtCategory.Text;
          Break;
        end;
      end;
    end;
  end;
end;

注意事项

  • 确保TextBox的ID属性确实为TextBox1,Delphi Prism对大小写敏感
  • 若处于编辑模式,需使用GridView1.EditIndex获取编辑行,而非SelectedRow

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:01:02