1

我有一个自定义的 gridview。我的网格只需在标题中单击 1 次即可对每一列进行排序,而无需用户(程序员)进行任何设置和重载方法,例如排序等。(我成功地做到了并且工作正常)用户(程序员)可能会在网格中添加每一列。例如模板字段、超链接字段、绑定字段...。对于排序,我必须访问列的数据字段。我可以通过此代码访问 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;
                        }
                 }

但我可以访问模板字段中的控制。例如 ColumnBound。样本:

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

我想访问 "Name" (Bind ("Name") 或 Eval ("Name")) 。我怎样才能?有一点:我现在不知道模板字段中控件的 ID(在本例中为“Label1”)是什么。特别感谢

4

1 回答 1

1

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

如果您采用一些受约束的视图,例如只能对标签和/或锚点绑定到某些数据字段的模板字段进行排序,那么方法将是

  1. 查看列是否为模板字段 ( var tf = this.Columns[j] as TemplateField)
  2. 如果是,取模板(使用ItemTemplate属性)
  3. 通过模板的子控件递归迭代,如果您找到标签(或说锚点)然后检查其文本属性以获取数据绑定表达式并获取您的数据字段。

但是这种方法对于诸如<img src="Some Icon" /><span><%# Eval("Name") %></span>.

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

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

于 2010-12-31T08:49:49.650 回答