Asp.net 对于每个GridviewRow循环,使用where子句?
有没有更简单的方法来使用代码:Asp.net 对于每个GridviewRow循环,使用where子句?,asp.net,vb.net,gridview,for-loop,linq,Asp.net,Vb.net,Gridview,For Loop,Linq,有没有更简单的方法来使用代码: For Each gvRow As GridViewRow In gvGridviewExample.Rows If gvRow.RowType = DataControlRowType.DataRow Then 'Do Something End If Next 例如,当使用iEnumerable时,理论上(伪代码样式)添加: 我只是想知道是否有一种更简单的编码方法 谢谢 Firstcape除了您的第一个代码片段实际上非常简单和
For Each gvRow As GridViewRow In gvGridviewExample.Rows
If gvRow.RowType = DataControlRowType.DataRow Then
'Do Something
End If
Next
例如,当使用iEnumerable时,理论上(伪代码样式)添加:
我只是想知道是否有一种更简单的编码方法
谢谢
Firstcape除了您的第一个代码片段实际上非常简单和清晰之外,
GridView
的Rows
属性只返回数据行DataRows
。所以你根本不需要检查类型
Rows
属性(集合)用于将数据行存储在
GridView控件
仅限RowType属性设置为的行
DataControlRowType.DataRow
存储在Rows集合中。这个
表示页眉、页脚和寻呼机行的GridViewRow对象
不包括在集合中
在诸如
RowCreated
或RowDataBound
之类的事件中,只能有不同的类型。如果您想访问这些事件之外的页眉、页脚或寻呼机,您可以使用GridView
的相应属性,如HeaderRow
或FooterRow
,除了Tim的答案(对于您的具体情况100%正确)之外,您还可以在类似情况下使用,即,当您只想迭代所有可见行时:
gvGridViewExample.Rows
.Where(Function(r) r.Displayed = True) ' Apply filter
.ToList()
.ForEach(Function(x) x.DoSomething()) ' Do something...
或
由于
GridView.Rows
只返回带有DataControlRowType.DataRow
的行,因此Where
是多余的(这就是我回答的全部要点)。ForEach
不会编译,因为它是List(Of t)
中的一个方法,但是Where
返回一个IEnumerable(Of t)
。之前您需要一个ToList
。但这是在浪费内存,因为一个简单的foreach
可以完美地工作。在这种情况下,你是对的,这就是为什么你得到了我的支持。我只是想添加这种可能性,以解决行类型
不是中的标准的情况,如果。。。然后
语句。您已经编辑了您的评论,我已经更新了我的答案;-)要使其编译,还必须使用gvGridViewExample.Rows.cast(GridViewRow的)(
将Rows
属性转换为IEnumerable(GridViewRow的)
。我不想吹毛求疵,但你可以看到,为了能够做一些毫无用处的事情,付出了巨大的努力;)但是已经实现了IEnumerable
,不是吗?!不,它实现了IEnumerable
。这就是为什么需要强制转换以及为什么还需要在foreach
中指定类型的原因。因此,以下foreach中的行的类型为Object
而非GridViewRow
:用于GridView1中的每一行。下一行
必须指定隐式转换的类型:用于GridView1中的每一行作为GridViewRow。下一行
我理解它非常简单明了,我想知道是否还有其他帮助,但正如您所指出的,它只收集数据行。谢谢你的帮助!
gvGridViewExample.Rows
.Where(Function(r) r.Displayed = True) ' Apply filter
.ToList()
.ForEach(Function(x) x.DoSomething()) ' Do something...
For Each row in gvGridViewExample.Rows.Where(Function(r) r.Displayed = True)
row.DoSomething()
Next