2013-07-27 49 views
0

在下面的ASP.Net 4.5 Gridview Databound事件中,它的工作原理非常好,在我看來,「If Not Usr Is Nothing Then」代碼行實際上應該在For EAch DataControlField之外因爲我只需要檢查一次。但是,當我用整個邏輯「如果不是我們不是那麼」(參見第二代碼迭代),我得到一個錯誤。任何想法重構不能按預期工作

Protected Sub gvEBEvals_DataBound(sender As Object, e As EventArgs) Handles gvEBEvals.DataBound 

    Dim revColumn As Integer = -1 
    Dim currentColumn As Integer = -1 
    Dim usr As MembershipUser = Membership.GetUser(HttpContext.Current.User.Identity.Name) 
    For Each col As DataControlField In gvEBEvals.Columns 
     If Not usr Is Nothing Then 
      If (Roles.IsUserInRole(usr.UserName, "administrator") Or Roles.IsUserInRole(usr.UserName, "developer")) Then 
       If col.HeaderText.ToLower().Trim() = "revenue potential" Then 
        revColumn = gvEBEvals.Columns.IndexOf(col) 
        For Each row As GridViewRow In sender.rows 
         If revColumn > -1 Then 
          row.Cells(revColumn).Text = String.Format("{0:c0}", Convert.ToDouble(row.Cells(revColumn).Text)) 
         End If 
        Next 
       End If 
      End If 
     End If 
     If col.HeaderText.ToLower().Trim() = "is current" Then 
      currentColumn = gvEBEvals.Columns.IndexOf(col) 
      For Each row As GridViewRow In sender.Rows 
       If currentColumn <> -1 Then 
        If row.Cells(currentColumn).Text = "True" Then row.Font.Bold = True 
       End If 

      Next 
     End If 
    Next 

End Sub 

使用一個呼叫測試用戶用戶的存在,哪些錯誤

If Not usr Is Nothing Then 
     For Each col As DataControlField In gvEBEvals.Columns    
       If (Roles.IsUserInRole(usr.UserName, "administrator") Or Roles.IsUserInRole(usr.UserName, "developer")) Then 
        If col.HeaderText.ToLower().Trim() = "revenue potential" Then 
         revColumn = gvEBEvals.Columns.IndexOf(col) 
         For Each row As GridViewRow In sender.rows 
          If revColumn > -1 Then 
           row.Cells(revColumn).Text = String.Format("{0:c0}", Convert.ToDouble(row.Cells(revColumn).Text)) 
          End If 
         Next 
        End If 
       End If 
      End If 
      If col.HeaderText.ToLower().Trim() = "is current" Then 
       currentColumn = gvEBEvals.Columns.IndexOf(col) 
       For Each row As GridViewRow In sender.Rows 
        If currentColumn <> -1 Then 
         If row.Cells(currentColumn).Text = "True" Then row.Font.Bold = True 
        End If 

       Next 
      End If 
     Next 
    Else 
    For Each col As DataControlField In gvEBEvals.Columns 
     If col.HeaderText.ToLower().Trim() = "is current" Then 
      currentColumn = gvEBEvals.Columns.IndexOf(col) 
      For Each row As GridViewRow In sender.Rows 
       If currentColumn <> -1 Then 
        If row.Cells(currentColumn).Text = "True" Then row.Font.Bold = True 
       End If 

      Next 
     End If 
Next 
    End If 

回答

0

因爲我沒有答覆,我提出了一些不同的refactors修改後的代碼和下面的代碼按預期工作 。

Protected Sub gvEBEvals_DataBound(sender As Object, e As EventArgs) Handles gvEBEvals.DataBound 

    Dim usr As MembershipUser = Membership.GetUser(HttpContext.Current.User.Identity.Name) 
    If Not usr Is Nothing Then 
     For Each col As DataControlField In gvEBEvals.Columns 
      If (Roles.IsUserInRole(usr.UserName, "administrator") Or Roles.IsUserInRole(usr.UserName, "developer")) Then 
       If col.HeaderText.ToLower().Trim() = "revenue potential" Then 
        Dim revColumn As Integer = gvEBEvals.Columns.IndexOf(col) 
        FormatCurrencyColumn(sender, revColumn) 
       End If 
      End If 

      If col.HeaderText.ToLower().Trim() = "is current" Then 
       Dim currentColumn As Integer = gvEBEvals.Columns.IndexOf(col) 
       BoldTrueRows(sender, currentColumn) 
      End If 
     Next 
    Else 

     For Each col As DataControlField In gvEBEvals.Columns 
      If col.HeaderText.ToLower().Trim() = "is current" Then 
       Dim currentColumn As Integer = gvEBEvals.Columns.IndexOf(col) 
       BoldTrueRows(sender, currentColumn) 
      End If 
     Next 
    End If 

End Sub 

Private Sub FormatCurrencyColumn(ByVal sender As Object, ByVal revColumn As Integer) 

    For Each row As GridViewRow In sender.rows 
     If revColumn > -1 Then 
      row.Cells(revColumn).Text = String.Format("{0:c0}", Convert.ToDouble(row.Cells(revColumn).Text)) 
     End If 
    Next 
End Sub 

Private Sub BoldTrueRows(ByVal sender As Object, ByVal currentColumn As Integer) 

    For Each row As GridViewRow In sender.Rows 
     If currentColumn <> -1 Then 
      If row.Cells(currentColumn).Text = "True" Then row.Font.Bold = True 
     End If 
    Next 
End Sub