#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"