如何使用自定义标识访问Templatefield Gridview中的控件

时间:2010-12-31 07:30:43

标签: asp.net gridview itemtemplate templatefield

我有一个自定义的gridview.my网格能够在标题中单击1次点击每个列,没有任何设置和重载方法,如用户(程序员)的排序等。(我这样做成功并且工作正常) 用户(程序员)可能会在grid中添加每个列。例如模板字段,超链接字段,边界字段.... 为了排序,我必须访问列的数据字段。 我可以通过此代码访问boundfield列。我可以访问数据字段和标题文本和... 样品:

for (int j = 0; j < this.Columns.Count; j++)
                {
                    BoundField bf;
                    bf = this.Columns[j] as BoundField;
                        if (bf != null)
                        {
                            string ht = bf.HeaderText;
                            string df = bf.DataField;
                        }
                 }

但我可以访问templateField等templateFound中的控件。 样品:

  <asp:Label ID="Label1" runat="server" Text='<%# Bind("Name") %>'></asp:Label>

我想要访问“名称”(Bind(“Name”)或Eval(“Name”))。 我怎么能够? 有一点:我现在不知道templatefield中控件的ID(在本例中为“Label1”)是什么。 特别感谢

1 个答案:

答案 0 :(得分:1)

对模板字段进行排序可能不可行 - 模板字段可能已与多个数据字段绑定,并且难以确定正确的排序字段。

如果你采取一些约束视图,例如只有那些模板字段可以被排序,其中label和/或anchor被绑定到某个数据字段,那么方法就是

  1. 查看列是否为模板字段(var tf = this.Columns[j] as TemplateField
  2. 如果是,请取模板(使用ItemTemplate属性)
  3. 通过模板的子控件递归迭代,如果找到标签(或称锚),则检查其text属性以获取数据绑定表达式并获取数据字段。
  4. 但是这种方法会因<img src="Some Icon" /><span><%# Eval("Name") %></span>等模板而失败。

    上述技术的另一种变体是获取字段的项模板,然后调用Render方法获取模板html,然后您可以解析它以搜索数据绑定表达式,然后决定您的数据字段。但是,这种方法有其自身的缺陷 - 例如,<img src='<%# Eval("IconType") %>' /><span><%# Eval("Name") %></span>之类的模板可能会使上述逻辑按 IconType 字段而不是 Name 字段进行排序。 / p>

    IMO,更强大的方法是在gridview控件中拥有属性/方法,接受模板列的排序字段(如果有)。