Использование FindControl для поиска элементов управления в ASP.Net DetailsView из файла кода программной части VB.Net не работает

Я хочу заставить FindControl «видеть» элементы управления в ASP.Net DetailsView из файла кода программной части VB.Net. Он не находит ни одного из них.

Разметка для страницы использует MasterPage.

<%@ Page 
    Title="Attendance" 
    Language="vb" 
    AutoEventWireup="false" 
    MasterPageFile="~/Knowledge Academy.Master" 
    CodeBehind="Attendance.aspx.vb" 
    Inherits="Knowledge_Academy.Attendance" %>

<asp:Content 
    ID="ContentBody" 
    ContentPlaceHolderID="BodyPlaceholder" 
    runat="server">

В настоящее время атрибуты нашего DetailsView выглядят следующим образом:

<asp:DetailsView 
            ID="DetailsView" 
            runat="server" 
            AutoGenerateRows="False" 
            Height="50px" 
            Width="207px" 
            DataSourceID="SqlDataSourceDetails"
            DataKeyNames="ID"
            OnItemCommand="DetailsViewDetails_ItemCommand">

            <Fields>

Можете ли вы сказать мне, какие дополнительные атрибуты следует включить, чтобы подобное кодирование могло «видеть» поля в DetailsView?

Protected Sub DetailsViewDetails_ItemCommand(sender As Object, e As System.Web.UI.WebControls.DetailsViewCommandEventArgs)

    Select Case e.CommandName

        Case "Add"

        Case "Edit"
            ButtonAddNewAttendance.Enabled = False

        Case "Delete"

        Case "Update"
            ButtonAddNewAttendance.Enabled = True

        Case "Insert"

        Case "New"

            Dim txtBox As TextBox
            txtBox = DetailsView.FindControl("TextBoxDateAttendanceTakenInsert")
            txtBox.Text = DateTime.Now

            Dim drpValue As DropDownList
            drpValue = DetailsView.FindControl("DropDownListClassInsert")
            drpValue.SelectedValue = 1
    End Select
End Sub

В настоящее время FindControl не может найти ни одно из полей в DetailsView и выдает ошибку нулевой ссылки.

  • ОБНОВИТЬ *

ItemCommand — неподходящее место для размещения кода.

Я обнаружил, что для того, чтобы это заработало, необходимо добавить OnDataBinding, как показано здесь, а также убедиться, что в файле кода программной части есть обработчик, как показано ниже.

Разметка InsertItemTemplate:

<InsertItemTemplate>
    <asp:DropDownList 
        ID="DropDownListClassInsert" 
        Runat="server"
        DataSourceID="SqlDataSourceClasses"
        DataTextField = "ClassName"
        DataValueField="ID"
        SelectedValue='<%# Bind("ClassID") %>'
        AppendDataBoundItems="True"
        ForeColor="Blue"
        OnDataBinding="DropDownListClassInsert_DataBinding">
    </asp:DropDownList>

    <asp:RequiredFieldValidator ID="RequiredFieldValidatorInsertClass" runat="server" ControlToValidate="DropDownListClassInsert" 
        ErrorMessage="Please select a Class here." Font-Bold="True" Font-Italic="True" ForeColor="Red" 
        SetFocusOnError="True" Display="Dynamic">
    </asp:RequiredFieldValidator>
</InsertItemTemplate>

Обработчик в файле кода программной части:

Protected Sub DropDownListClassInsert_DataBinding(sender As Object, e As EventArgs)

    Dim drpValue As DropDownList
    drpValue = DetailsView.FindControl("DropDownListClassInsert")
    drpValue.SelectedValue = intCurrentClassID
End Sub

Примечание: intCurrentClassID объявляется как:

Public Shared intCurrentClassID As Integer = Nothing

после:

Public Class

Я надеюсь, что это поможет другим, у кого были такие же проблемы.


person Emad-ud-deen    schedule 07.01.2013    source источник


Ответы (1)


Я считаю, что вы хотите использовать Fields вместо FindControl. Если у вас есть DataControlField, вы можете привести его к соответствующему типу элемента управления (например, CheckBoxField).

person competent_tech    schedule 07.01.2013
comment
Спасибо за ответ. Можете ли вы показать пример кода, основанный на нашем существующем коде? Спасибо. - person Emad-ud-deen; 07.01.2013
comment
@Emad-ud-deen: Конечно, но мне нужно было бы увидеть немного больше кода, чтобы предоставить это (именно поэтому я не пытался сделать это в ответе). Можете ли вы показать код в контексте того, где вы пытаетесь его использовать? - person competent_tech; 07.01.2013
comment
В порядке. Я отредактирую публикацию, чтобы показать полную подпрограмму. - person Emad-ud-deen; 08.01.2013