2012-05-11 2 views
0

Я попытался изо всех сил сократить программу до следующего кода. В этом примере у меня есть Великобритания и США как действительные страны. Если кто-то живет за пределами этих стран, я хочу показать сообщение об ошибке и выделить их в gridview. Например, Джон и Крис из Китая, поэтому они должны быть выделены в gridview. Можно ли это сделать? Пожалуйста, смотрите пример. Можно просто выделить имя или целую строку.Как выделить недопустимые данные в gridview, если проверка на DataTable не удалась VB.Net?

Большое спасибо.

Dim dt As New DataTable 
    dt.Columns.Add("ID") 
    dt.Columns.Add("Name") 
    dt.Columns.Add("Country") 

    dt.Rows.Add("1", "John", "China") 
    dt.Rows.Add("2", "Harry", "USA") 
    dt.Rows.Add("3", "Joe", "UK") 
    dt.Rows.Add("4", "Emma", "UK") 
    dt.Rows.Add("5", "Chris", "China") 
    dt.Rows.Add("6", "Jenny", "UK") 


    Dim isValid As Boolean = True 
    Dim keywords() As String = {"UK", "USA"} 
    Dim str As String = "" 

    For Each x As DataRow In dt.Rows 
     If Not keywords.Contains(x("Country").ToString()) = True Then 
      isValid = False 
     End If 
    Next 

    If isValid = False Then 
     lblmessage.Text = "Some people don't live in valid countries" 
    End If 

    GridView1.DataSource = dt 
    GridView1.DataBind() 

enter image description here

+0

Я предполагаю, что ASP.NET с Winforms GridView называется DataGridView. –

ответ

1

Можно ли это сделать?

Да, одним из способов является использование события GridView RowDataBound. Если у вас есть список допустимых стран:

Private validCountries() As String = {"UK", "USA"} 

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) 
    Select Case e.Row.RowType 
     Case DataControlRowType.DataRow 
      Dim row = DirectCast(e.Row.DataItem, DataRowView).Row 
      Dim country = row.Field(Of String)("Country") 
      ' assuming you're using TemplateFields with LblName for the Name of the user ' 
      Dim LblName = DirectCast(e.Row.FindControl("LblName"), Label) 
      If Not validCountries.Contains(country.ToUpper) Then 
       LblName.CssClass = "InvalidCountry" 
      End If 
    End Select 
End Sub 

Если вы используете BoundFields вместо этого, вы должны применить CSS на ячейку таблицы

e.Row.Cells(1).CssClass = "InvalidCountry" 
+0

Спасибо Тиму .. Ваш пример замечательный! Я все еще думаю, могу ли я использовать это в своей программе .. infact, проверка выполняется в функциях ... Великобритания и США - просто пример, на самом деле у него есть 10 + ключевые слова для проверки. Если я могу вернуть недопустимый номер строки DataTable из функции проверки в массиве или списке, могу ли я быть выделенным в gridview при привязке? – lawphotog

+0

@LaurenceNyein: Я отредактировал свой ответ, чтобы показать, как проверять список стран. Или я неправильно понял ваш последний комментарий? –

+0

Спасибо, Тим ... мне будет намного легче работать с ним. Приятного дня! – lawphotog

0

Я буду держать ответ Тима в качестве правильного ответа , Я очень ценю его помощь. Это альтернатива тому, что мы можем сделать, если кто-то пытается сделать то же самое, что и я. Надеюсь, это поможет кому-то там.

Imports System.Data 

    Partial Class _Default 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load 

    Dim dt As New DataTable 
    dt.Columns.Add("ID") 
    dt.Columns.Add("NAME") 

    dt.Rows.Add("1", "John") 
    dt.Rows.Add("2", "Chris") 
    dt.Rows.Add("3", "") 

    Dim str As New StringBuilder 

    If checkName(dt) = False Then 
     str.Append("Empty Name <br />") 
    End If 

    Literal1.Text = str.ToString 

    GridView1.DataSource = dt 
    GridView1.DataBind() 

    For Each gvrow In GridView1.Rows 
     For iCol = 0 To gvrow.Cells.Count - 1 
      If InStr(gvrow.Cells(iCol).Text, "***") > 0 Then 
       gvrow.Cells(iCol).Text = Replace(gvrow.Cells(iCol).Text, "***", "") 
       gvrow.Cells(iCol).ForeColor = Drawing.Color.Red 
       gvrow.Cells(iCol).BackColor = Drawing.Color.LightCyan 
      End If 

     Next 
    Next 

    End Sub 

    Private Function checkName(dt As DataTable) As Boolean 

    For Each x In dt.Rows 
     If x("Name") = "" Then 
      x("Name") = "***" 
      Return False 
     End If 
    Next 

    Return True 
    End Function 

    End Class