Ссылка на объект не установлена ​​для экземпляра - пытается получить DataRowView из ListItem - PullRequest
0 голосов
/ 09 декабря 2011

Я пытаюсь получить связанные значения из строки в ListItem.У меня есть кнопка в каждой строке, которая при нажатии будет выполнять задачу (отправка сообщения электронной почты человеку, чье имя и адрес электронной почты находятся в этой строке списка. Итак, у меня есть обработчик событий, связанный с представлением списка, и я пытаюсьдобраться до базового datarowview для извлечения элементов данных.

Вот что у меня есть в обработчике событий:

Protected Sub lvUsers_ItemCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewCommandEventArgs) Handles lvUsers.ItemCommand
    Dim diCurrentUser As ListViewDataItem = CType(e.Item, ListViewDataItem)
    Dim drCurrentRow As DataRowView = CType(diCurrentUser.DataItem, DataRowView)
    Select Case e.CommandName
            Case "Email"
                Dim strEmailAddress As String = drCurrentRow("contact_email").ToString.Trim
                Dim strUserName As String = drCurrentRow("login").ToString.Trim
                Dim strUserID As String = drCurrentRow("username").ToString.Trim
                Dim strPassword As String = drCurrentRow("password").ToString.Trim

Теперь, это терпит неудачу в строке, где я пытаюсь обратиться к contact_emailэлемент в объекте DataRowView.

Что я делаю не так?

Спасибо

1 Ответ

0 голосов
/ 10 декабря 2011

У вас есть несколько вещей, которые нужно проверить:

1) Убедитесь, что drCurrentRow IsNot Nothing, прежде чем пытаться получить доступ к его значениям.

2) Если drCurrentRow действителен, убедитесь, что он содержит столбецвызвал contact_email до его обработки.Например:

If drCurrentRow.Row.Table.Columns.Contains("contact_email") Then

3) Если столбец существует, вам необходимо проверить содержимое элемента на предмет «Ничего» и / или DBNull.Value на эквивалентность, прежде чем пытаться выполнить операции со значением.Например:

If Not drCurrentRow.IsNull("contact_email") Then

Итак, часть вашего кода будет переписана следующим образом:

Public Function GetRowStringValue(oRowView As DataRowView, sColumnName As String) As String
   If oRowView IsNot Nothing Then
       If oRowView.Row.Table.Columns.Contains(sColumnName) Then
          If Not oRowView.IsNull(sColumnName) Then
             Return oRowView(sColumnName).ToString.Trim
          End If
       End If
   End If
End Function  

Select Case e.CommandName
    Case "Email"
        Dim strEmailAddress As String = GetRowStringValue(drCurrentRow, "contact_email")
        Dim strUserName As String = GetRowStringValue(drCurrentRow, "login")
        Dim strUserID As String = GetRowStringValue(drCurrentRow, "username")
        Dim strPassword As String = GetRowStringValue(drCurrentRow, "password")
...