2013-07-27 4 views
0

В приведенном ниже примере событий базы данных ASP.NET 4.5 Gridview, который отлично работает как есть, мне кажется, что строка кода «If Not usr Is Nothing Then» должна фактически находиться вне поля «For EAch DataControlField» потому что мне нужно только один раз проверить это. Однако, когда я обертываю всю логику тем, что «If Not usr is Nothing Then» (см. Вторую итерацию кода), я получаю сообщение об ошибке. Любые мыслиРефакторинг не работает должным образом

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 
Смежные вопросы