1

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

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

我不知道是否有办法做到这一点,但最好能够换出默认命名容器,以便单元格成为命名容器,然后我可以拥有相同的控件名称。

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

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

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

4

2 回答 2

1

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

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

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

于 2009-08-27T18:16:46.000 回答
0

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

于 2009-08-27T17:33:20.737 回答