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:
- 在GridView的列配置中新增
TemplateField - 在
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
相关产品推荐
相关产品推荐

