如何显示所有数组而不仅仅是第一个[0]

时间:2011-01-28 02:42:26

标签: c# .net winforms arrays

Label lblSize=(Label)list.Items[0].FindControl("lblSize");

我有一个DataList,需要在那些没有值的Visible更改为false。就像它现在它只适用于第一个产品。如何更改它以使其适用于所有产品,而不仅仅是第一个[0]

2 个答案:

答案 0 :(得分:2)

请注意,如果您只是将var替换为DataListItemRobert'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的工作原理:

  1. 查找类型的GetEnumerator方法。
  2. 在返回的对象类型中,它会查找MoveNext方法。
  3. 成功拨打MoveNext后,会查找Current媒体资源。
  4. 请注意a strict implementation of IEnumerable<T> or IEnumerable is not required - 仅列出我刚刚列出的确切标准。

    现在,通过实施foreachIEnumerable<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...
}