Asp.net Net GridView通过for循环检索每行的单元格值并隐藏空列

Asp.net Net GridView通过for循环检索每行的单元格值并隐藏空列,asp.net,gridview,indexoutofrangeexception,Asp.net,Gridview,Indexoutofrangeexception,我知道这个问题的变体被问了很多次,我一直在寻找答案,并尝试了许多不同的代码块。这是我现在所拥有的,我正在从0循环到gridview1.rows.count-1。此代码位于RowDataBound事件中 Dim test As String For i As Integer = 0 To GridView1.Rows.Count - 1 test = GridView1.Rows(i).Cells.Item(e.Row.RowIndex).Text.ToString

我知道这个问题的变体被问了很多次,我一直在寻找答案,并尝试了许多不同的代码块。这是我现在所拥有的,我正在从0循环到gridview1.rows.count-1。此代码位于RowDataBound事件中

    Dim test As String
    For i As Integer = 0 To GridView1.Rows.Count - 1
        test = GridView1.Rows(i).Cells.Item(e.Row.RowIndex).Text.ToString
        If test = " " Then
            e.Row.Cells(i).Visible = False
        End If

    Next
每次出现错误时:指定的参数超出有效值的范围。 参数名称:此行上的索引

   test = GridView1.Rows(i).Cells.Item(e.Row.RowIndex).Text.ToString
但是,我认为错误只是因为我超出了行范围,但无法确定如何修复它。如何成功地检查所有行和列的每个单元格并隐藏不返回任何内容的列

现在,我可以隐藏每个列中的所有实际单元格,该列为空

 Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As      System.Web.UI.WebControls.GridViewRowEventArgs)
  Dim GridView1 As GridView = FormView1.FindControl("GridView1")
    For Each row As GridViewRow In GridView1.Rows
      For i As Integer = 0 To row.Cells.Count - 1
       Dim strtest As String = row.Cells(i).Text.ToString
         If strtest = " " Then
         row.Cells(i).Visible = False
         End If      
        Next
    Next
但它仍然不允许我隐藏列,因为使用autogeneratecolumns它无法识别任何列,因此代码, GridView1.Columnsi.visible=false 抛出超出范围错误,因为没有列的范围

For Each row As GridViewRow in GridView1.rows // rows
dim someval as String
 for x= 0 to  GridView1.Columns.Count // cols 
  if someval=  = row.Cells[x].Text;
 GridView1.Columns(x).Visible = false;
end if
 next x
Next

手动输入请检查输入错误。

试试这样的方法

但我可能会指出,每次绑定一行时,您似乎都在阅读整个网格,这似乎是不必要的。相反,您可以有一个单独的方法,可以在gridview数据绑定后调用该方法来隐藏列

将下面的代码放入函数中,并在网格数据绑定后调用此函数

Private Sub CheckForEmptyValues()
    Dim dgv As DataGridView = GridView1

    For r As Integer = 0 To dgv.RowCount - 1
       For c As Integer = 0 To dgv.ColumnCount - 1
            Dim cellValue as string = dgv.Rows(r).Cells(c).Value
            If cellValue = " " Then
               dgv.Rows(r).Cells(c).Visible = False
            End If
        Next
    Next
End Sub

好了,伙计们,我终于找到了正确的方法,至少是一种适合我的方法。因此,当autogeneratecolumns设置为true时,必须使用row.cells.count-1来实际获取列的计数,并且为了遍历列以将其设置为visible=false,必须使用

GridView1.HeaderRow.Cells(i).visible = False
这是我最后的代码,希望这能帮助很多有同样问题的人,谢谢大家的帮助和回答

 Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
    Dim GridView1 As GridView = FormView1.FindControl("GridView1")
    For Each row As GridViewRow In GridView1.Rows
        For i As Integer = 0 To row.Cells.Count - 1
            Dim strtest As String = row.Cells(i).Text.ToString
            If strtest = " " Then
                GridView1.HeaderRow.Cells(i).Visible = False
                row.Cells(i).Visible = False

            End If

        Next
    Next
 End Sub

在哪种情况下,您有此代码?在RowDataBound或其他位置?RowDataBound,抱歉,我想在问题中包括这个循环是否至少在某些迭代中有效?是的,它将返回单元格中的文本值,并将其分配给变量测试,直到出现错误为止。知道我的网格视图列是自动生成的可能会有所帮助,因为我有大约20个不同的SQLDataSource在gridview中切换。但是,此代码正在正确读取值,仅读取第一列的值。并且仅设置为删除第3列。如何循环执行此操作,以便检查整个gridview并动态删除该列,使其看起来像GridView1.Columnsi.Visible=False添加另一个循环以获取所有单元格,然后关闭任意单元格,我将在一分钟内更新答案。此代码抛出一个错误,即GridView1.Columnsx.Visible=False上的索引超出范围。此错误可能是由于我正在自动生成列,但尚未创建这些列造成的吗?如果是这样的话,我该如何解决这个问题取决于你在哪里使用代码,如果它在页面上的网格之后,那么自动生成就不是问题GridView1.Columnsx-1,如果要修复它,我将用CellsPartID和替换dgvPartByCategory的是,只指定一个名为PartID的特定列?我正在尝试搜索所有列,而不仅仅是一列OK,使用单独子项所需的代码编辑了我的答案。没有必要在RowDataBound事件中检查所有网格行和单元格。此外,您可能需要检查空值,如cellValue为Nothing,Also value为DBNull。值然后变量r声明两次,并抛出一个局部变量,该变量已声明为错误