【问题标题】:Custom Naming Container for ASP.NET GridView?ASP.NET GridView 的自定义命名容器?
【发布时间】:2010-11-23 11:23:02
【问题描述】:

我正在寻找有关如何为 GridView 中的项目实现自定义命名容器的信息。我的问题是,我有一个 GridView,一周中的每一天都有一个单元格,每个单元格都将包含相同或相似的控件。对于相同的控件,最好将它们都命名为相同的名称,例如“lblPersonName”。

但是,如果你这样做,你就不能使用 FindControl(),因为它会抱怨在行中有具有重复 ID 的控件。问题的根源在于 GridView 中控件的命名容器不是表格的单元格(DataControlFieldCell 或其他),而是 GridViewRow。

我不知道是否有办法做到这一点,但最好能够换出默认命名容器,以便单元格确实成为命名容器,并且那么我可以使用相同的控件名称。

当然,为此的 ASPX 开始变得有点大 - 我开始希望我已经在 ASP.NET MVC 中启动了这个项目......

在任何情况下,就如何使用这样的控件实现 GridView 而言,我对其他选择持开放态度。在这一点上,使用一个普通的旧表并动态添加控件可能会更干净......

为了澄清: - 每列都使用 ItemTemplate 定义,控件位于 ItemTemplate 中。 - 现在让它工作的唯一方法是拥有“lblPersonNameOne”、“lblPersonNameTwo”等。

【问题讨论】:

    标签: data-binding gridview naming-containers


    【解决方案1】:

    实际上,这似乎很容易......我现在正在试验的是我创建了一个从 asp:Panel 继承的客户服务器控件,但它实现了 INamingContainer。当你实现它时,它会自动将控件的 ID 插入到子控件的唯一 ID 流中。

    因此,您可以从每个模板中添加具有相同 ID 的控件(动态或声明式),它们将获得自己的 ID。然后你只需要在单元格本身上使用 FindControl,而不是在行上,它就会找到带有搜索 ID + 唯一 ID 附加组件的控件。

    上述解决方案有效,但将所有同名控件放在一个普通的旧 ascx 用户控件中可能同样简单和清晰,我相信它实现了 INamingContainer。然后,您可以像往常一样使用它。使用用户控件的唯一缺点是您不能轻松地将数据绑定到父页面上的数据源,诸如此类。当然仍然可以通过父母,但不是声明性的。

    【讨论】:

      【解决方案2】:

      如果您将每一列都设为 TemplateField,并在模板中声明控件会怎样。这样,每个控件都必须有一个唯一的标识符。

      【讨论】:

      • 每一列都是一个模板字段,控件是在模板中声明的。因此,例如,我有两列 ColOne 和 ColTwo,它们中的每一个在模板定义中都有一个名为“lblPersonName”的控件。如果在这种情况下调用 FindControl(),则会出现异常。因此,您必须将标签命名为“lblPersonNameOne”和“lblPersonNameTwo”。如果您有很多控件,这会变得很多。
      • 我认为“控件太多”是您的根本问题。但最简单的解决方案是简单地给每个控件一个唯一的 ID。在 IMO 中,创建自定义命名容器的开销太大。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2010-09-23
      • 2011-09-09
      • 2015-04-15
      • 1970-01-01
      相关资源
      最近更新 更多