Как получить значение столбца, используя dataview в vb.net

#vb.net

#vb.net

Вопрос:

У меня есть список записей, и для Employee R1005 мне нужно проверить, включен ли для этого Employee оповещение о входе в систему (т.е. EnableLoginAlert = Yes), после чего появится кнопка.

 CompanyID      EmployeeNo     EnableLoginAlert    

 10046           R1005              Yes
 20041           Ajax12             No
 47021           Drek               Yes
  

Я пробовал приведенные ниже коды:

 If dCompanyDetails.Tables(0).Rows.Count > 0 Then

        Dim dataView As DataView = dCompanyDetails.Tables(0).DefaultView
        dataView.RowFilter = "EmployeeNo     = '" amp; strEmployeeNumber amp; "'"
    
       
        Dim svalue As String = dataView.Table.Rows(0).ItemArray(0).ToString()

        If svalue = "No" Then
            AlertButton.Visible = False

        ElseIf svalue = "Yes" Then
         {
            //Do something else
         }
        
        End If

End If
  

Ответ №1:

Если вы собираетесь использовать a DataView , тогда используйте его. Это:

  Dim svalue As String = dataView.Table.Rows(0).ItemArray(0).ToString()
  

просто возвращается к DataTable и использует его, игнорируя DataView . DataView Содержит DataRowView объекты, поэтому найдите тот, который вам нужен, и используйте его. Он похож на a DataRow , и вы можете использовать его таким же образом в этом случае:

 Dim enableLoginAlert = CStr(dataView(0)("EnableLoginAlert")) = "Yes"
  

Теперь у вас есть фактическое Boolean значение, которое представляет нужное вам состояние.

Однако это не так, как вы должны это делать. Вообще говоря, вы должны использовать a DataView , когда хотите связать данные. Фактически, если вы привязываете a DataTable , то данные, которые вы видите в пользовательском интерфейсе, фактически поступают из DefaultView . Вот почему вы можете фильтровать и сортировать его. В этом случае есть лучшие варианты.

Если вы хотите найти строку по ее первичному ключу, то в Rows коллекции a DataTable есть Find метод, например

 Dim row = dCompanyDetails.Tables(0).Rows.Find(strEmployeeNumber)
Dim enableLoginAlert = CStr(row("EnableLoginAlert")) = "Yes"
  

Если вы ищете не по первичному ключу, у DataTable самого есть Select метод. Поскольку несколько строк могут совпадать, он возвращает массив, поэтому вам нужно извлечь строку из этого, например

 Dim row = dCompanyDetails.Tables(0).Select($"EmployeeNo = '{strEmployeeNumber}'").First()
Dim enableLoginAlert = CStr(row("EnableLoginAlert")) = "Yes"
  

Ответ №2:

Если вы хотите найти одну строку, возможно, проще всего использовать LINQ:

 Dim row = dCompanyDetails.Tables(0).Rows.Cast(Of DataRow).AsQueryable().FirstOrDefault(Function(r) r("EmployeeNo").ToString() = strEmployeeNumber)

If row IsNot Nothing AndAlso row("EnableLoginAlert").ToString() = "Yes" Then

  ...
  

..хотя я был бы первым, кто заявил бы, что использование LINQ для базовых таблиц данных очень подробное из-за приведения / запроса. Я бы использовал строго типизированные таблицы данных (в наборе данных); если бы вы преобразовали свой код в использование строго типизированных таблиц, это выглядело бы так:

 Dim r = someDataSet.AProperTableName.FirstOrDefault(Function(r) r.EmployeeNo = strEmployeeNumber)

If r?.EnableLoginALert = "Yes" Then
  ...
  

… использование строго типизированных таблиц данных намного менее запутанно..

примечание: вам нужно, чтобы Imports System.Linq они работали


Этот LINQ — это то же самое, что:

 For Each r as DataRow in dCompanyDetails.Tables(0) 

  If r("EmployeeNo").ToString() = "R1005" AndAlso r("EnableLoginAlert").ToString() = "Yes" Then
    
      ...
  

У вас также есть возможность использовать DataTable.Select (не вещь LINQ, хотя у LINQ тоже есть Select)

 Dim matchingRows = dCompanyDetails.Tables(0).Select($"[EmployeeNo] = '{strEmployeeNumber}'")

If matchingrows.Count > 0 AndAlso matchingRows(0)("EnableLoginAlert").ToString() = "Yes"