Это назначение вызовет InvalidCastException
, поскольку оно пытается преобразовать значение Object
непосредственно из свойства DataKey.Value
в Guid
тип:
Dim id As Guid = grdTaskList.DataKeys(row.RowIndex).Value 'throws InvalidCastException
Вам нужно использовать конструктор CType
или System.Guid
:
' using type conversion
Dim id As Guid = CType(grdTaskList.DataKeys(row.RowIndex).Value, System.Guid)
' alternative with Guid constructor
Dim id As Guid = New Guid(DirectCast(grdTaskList.DataKeys(row.RowIndex).Value, String))
Также можно использовать метод Guid.Parse
, чтобы убедиться, что переданное значение имеет правильный формат GUID:
Dim id As Guid = Guid.Parse(grdTaskList.DataKeys(row.RowIndex).Value.ToString())
Или, если GUID использует определенное форматирование, такое как дефисы и / или заключенные в фигурные скобки, используйте Guid.ParseExact
с указателем формата, как в примере ниже:
'example format: 00000000-0000-0000-0000-000000000000
Dim id As Guid = Guid.ParseExact(grdTaskList.DataKeys(row.RowIndex).Value.ToString(), "D")
В качестве дополнительного примечания, используйте TryParse
или TryParseExact
, если вы хотите поставить условия относительно действительного значения GUID.
Обновление 1:
Поскольку DataKey.Value
имеет тип Integer
, аргумент CType
необходимо немного изменить:
Dim id As Guid = New Guid(CType(grdTaskList.DataKeys(row.RowIndex).Value, Integer))
Или используйте преобразование Integer
в Guid
с пользовательской общей функцией:
' other module
Public Shared Function ToGuid(ByVal value As Integer) As Guid
Dim bytes As Byte() = New Byte(16)
BitConverter.GetBytes(value).CopyTo(bytes, 0)
Return New Guid(bytes)
End Function
' RowCommand method
Dim val As Integer = CType(grdTaskList.DataKeys(row.RowIndex).Value, Integer)
Dim id As Guid = ToGuid(val)