2017-06-20 37 views
0

我能够获得正确的行数,但问题是当我运行循环时。在datagridview中查找可见行的值

OrdNum = dgvWsNorth.Rows(i).Cells("ORDNUM").Value.ToString() 

这条线将遍历所有可见和不可见的行=到行数。

我需要它通过只可见行=循环行数。

Dim AllRows As Integer = dgvWsNorth.Rows.GetRowCount(DataGridViewElementStates.Visible) 
     Dim OrdNum As Integer 
     Dim LinNum As Integer 
     Dim UnitPriority As Integer 
     Dim Ws_N As Integer = My.Settings.NorthLine 

     For i = 0 To AllRows - 1 

      OrdNum = dgvWsNorth.Rows(i).Cells("ORDNUM").Value.ToString() 
      LinNum = dgvWsNorth.Rows(i).Cells("LINE").Value.ToString() 


      If IsDBNull(dgvWsNorth.Rows(i).Cells("UNIT_PRIORITY").Value) Then 
       UnitPriority = 999 
      Else 
       UnitPriority = dgvWsNorth.Rows(i).Cells("UNIT_PRIORITY").Value.ToString() 
      End If 

       clsScheduler.UPDATE_ASSIGNED_WS(Ws_N, OrdNum, LinNum, clsLogin.plant_id, clsLogin.dept_id, UnitPriority) 

     Next 
+0

仅仅因为行被隐藏并不意味着它们的行索引更改。正如已经回答的那样,我认为你需要检查当前的迭代是否是可见的行,并采取行动。 –

回答

1

如何循环遍历所有行,并只计算可见的行?

Dim i = 0 
    Dim OrdNum As Integer 
    Dim LinNum As Integer 
    Dim UnitPriority As Integer 
    Dim Ws_N As Integer = My.Settings.NorthLine 
    For Each r As DataGridViewRow In dgvWsNorth.Rows 

     If r.Visible Then 

      OrdNum = r.Cells("ORDNUM").Value.ToString() 
      LinNum = r.Cells("LINE").Value.ToString() 


      If IsDBNull(r.Cells("UNIT_PRIORITY").Value) Then 
       UnitPriority = 999 
      Else 
       UnitPriority = r.Cells("UNIT_PRIORITY").Value.ToString() 
      End If 

      clsScheduler.UPDATE_ASSIGNED_WS(Ws_N, OrdNum, LinNum, clsLogin.plant_id, clsLogin.dept_id, UnitPriority) 

      i += 1 
     End If 
    Next 
+0

正是我需要的!谢谢 –

0

其实,我决定给这个一杆,我想你可以用LAMBDA您为每个语句

取而代之的是为下一个循环使用的每一个lambda表达式

做到这一点
For each r as datagridviewrow in DataGridView1.Rows.Cast(Of Datagridviewrow)().Where(Function(row) row.Visible = true) 

... your loop code using r instead of rows(i) 

Next 

这应该只遍历可见的行。

相关问题