Label lblSize=(Label)list.Items[0].FindControl("lblSize");
我有一个DataList
,需要在那些没有值的Visible
更改为false
。就像它现在它只适用于第一个产品。如何更改它以使其适用于所有产品,而不仅仅是第一个[0]
?
答案 0 :(得分:2)
请注意,如果您只是将var
替换为DataListItem
,Robert's answer可能会有效。
或者,for
循环也应该起作用:
for (int i = 0; i < list.Items.Count; ++i)
{
Label lblSize = (Label)list.Items[i].FindControl("lblSize");
// Do whatever you need to.
}
更新:仅仅是因为问题(在评论中):为什么foreach
循环不起作用?
以下是foreach
的工作原理:
GetEnumerator
方法。MoveNext
方法。MoveNext
后,会查找Current
媒体资源。请注意a strict implementation of IEnumerable<T>
or IEnumerable
is not required - 仅列出我刚刚列出的确切标准。
现在,通过实施foreach
或IEnumerable<T>
,您可以通过实施IEnumerable
循环来为您的类型配备符合<{1}}循环的便捷方式;在DataList.Items
属性返回DataListItemCollection
的情况下,设计者选择简单地实现IEnumerable
(我怀疑这是有原因的 - 框架中的所有UI控件基本上都是非-generic)。 GetEnumerator
方法返回一个对象,其类型实现简单的IEnumerator
接口,其Current
属性仅为object
。
这一切意味着如果你foreach
超过DataListItemCollection
,并且使用var
声明局部变量,那么编译器不知道是什么对象类型驻留在您正在迭代的集合中。因此,它做出了一个保守的选择:object
(将鼠标悬停在Visual Studio中的本地上以确认这一点。)
foreach
构造的工作方式,如果您选择(<{1}}),可以更强烈地键入局部变量;编译器会为您在后台插入一个强制转换。
为了说明,我可以尝试:
foreach (DataListItem item in ...
以上将编译 - 编译器真诚地接受我在编写List<int> integers = new List<int> { 1, 2, 3 };
IEnumerable enumerable = integers;
foreach (string s in enumerable)
{
Console.WriteLine(s);
}
时知道我在做什么 - 但它会在运行时抛出foreach (string s ...
。
有意义吗?
答案 1 :(得分:1)
一个简单的循环可以解决这个问题......
foreach( var x in list.Items )
{
Label lblSize = (Label)x.FindControl("lblSize");
// whatever you do with lblSize...
}