Как я могу ссылаться на значение метки GridView TemplateField из RowCommand? - PullRequest
0 голосов
/ 01 мая 2018

Мне нужно сослаться на значение метки из lblCaseStatus в выбранной строке следующего вида сетки:

<asp:GridView ID="grdTaskList" runat="server" DataKeyNames="CaseID"
              AutoGenerateColumns="False" AllowSorting="True" AllowPaging="True"
              PageSize="20">
    <Columns>
        <asp:BoundField DataField="Task" HeaderText="Task" SortExpression="Task" 
                        ItemStyle-Width="350px" />
        <asp:BoundField DataField="DueDate" HeaderText="Due Date" SortExpression="DueDate"
                        DataFormatString="{0:d}" />
        <asp:TemplateField HeaderText="Case Status">
            <ItemTemplate>
                <asp:Label ID="lblCaseStatus" runat="server"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="btnView" runat="server" Text="View"
                                CommandName="ViewIntake"
                                CommandArgument='<%# Eval("CaseID") %>' 
                                Font-Bold="true" />
            </ItemTemplate>
            <ItemStyle HorizontalAlign="Center" />
    </asp:TemplateField>
    </Columns>
</asp:GridView>  

Я искал в Интернете и не нашел решений, которые будут работать. Я попытался использовать один на основе этого SO ответа (https://stackoverflow.com/a/10784039/3938754), который включал этот отказ от ответственности:
Примечание: это работает только с Boundfields.
Я использую TemplateField и думаю, что по этой причине он терпит неудачу на линии:

Dim id as Guid = grdTaskList.DataKeys (row.RowIndex). Значение

с ошибкой чтения:
Указанный состав недействителен. (При приведении из числа значение должно быть числом меньше бесконечности.)
И RowIndex и Значение имеют данные.

Private Sub grdTaskList_RowCommand(sender As Object, e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles grdTaskList.RowCommand
    If (e.CommandName = "ViewIntake") Then
        Dim caseID As Integer = Int32.Parse(e.CommandArgument.ToString())

        Dim row As GridViewRow = CType(CType(e.CommandSource, Control).NamingContainer, GridViewRow)
        Dim id As Guid = grdTaskList.DataKeys(row.RowIndex).Value
        Dim caseStatus As String = CType(row.Cells(2), DataControlFieldCell).Text

        Response.Redirect(IntakeSite.EditIntake.GetPageURL(caseID:=caseID, caseStatus:=caseStatus))
    End If
End Sub

Так как мне ссылаться на значение метки внутри ItemTemplate из метода RowCommand?

Заранее спасибо за ваше время и помощь.

1 Ответ

0 голосов
/ 02 мая 2018

Это назначение вызовет 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)
...