我正在寻找有关如何为GridView中的项目实现自定义命名容器的信息。我的问题是我有一个GridView,每周的每一天都有一个单元格,每个单元格将包含相同或类似的控件。对于相同的控件,将它们命名为all lld很好,例如“lblPersonName”。
但是,如果你这样做,就不能使用FindControl(),因为它会抱怨行内有重复ID的控件。问题的根源是GridView中控件的命名容器不是表的单元格(DataControlFieldCell或其他),但它是GridViewRow。
我不知道是否有办法做到这一点,但能够更换默认命名容器以便 单元格成为命名容器,并且很高兴然后我可以拥有相同的控件名称。
当然,ASPX开始变得有点大了 - 我开始希望我已经在ASP.NET MVC中启动了项目....
无论如何,对于如何使用这样的控件实现GridView,我对其他选择持开放态度。此时,使用普通旧表并动态添加控件可能更简洁......
澄清: - 每个列都使用ItemTemplate定义,控件存在于ItemTemplate中。 - 让它立即工作的唯一方法是拥有“lblPersonNameOne”,“lblPersonNameTwo”等。
答案 0 :(得分:1)
实际上,它似乎很容易......我现在正在尝试的是我创建了一个继承自asp:Panel的客户服务器控件,但它实现了INamingContainer。实现时,它会自动将控件的ID插入到子控件的唯一ID流中。
那么,您可以使用相同的ID(动态或声明性)添加每个模板的控件,并且它们将获得自己的ID。然后你只需要在单元格本身上使用FindControl,而不是在行上,它将找到带有搜索ID +唯一ID附加组件的控件。
上面的解决方案可行,但是将所有相同名称的控件放在一个普通的旧ascx用户控件中可能同样简单和清晰,我认为它实现了INamingContainer。然后,您可以像往常一样使用它。使用用户控件的唯一缺点是,您无法轻松地对父页面上的数据源进行数据绑定,以及类似的事情。当然仍然可以通过父母,但不能作为声明。
答案 1 :(得分:0)
如果您将每列设为TemplateField,并在模板中声明控件,该怎么办?这样,每个控件都必须具有唯一的标识符。