【问题标题】:Using FindControl to locate controls in an ASP.Net DetailsView from a VB.Net code-behind file not working使用 FindControl 从 VB.Net 代码隐藏文件中定位 ASP.Net DetailsView 中的控件不起作用
【发布时间】:2012-12-21 13:06:50
【问题描述】:

我希望 FindControl 从 VB.Net 代码隐藏文件中“查看”ASP.Net DetailsView 中的控件。它没有找到任何一个。

页面的标记正在使用 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 中找不到任何字段并给出 Null 引用错误。

  • 更新 *

ItemCommand 不是放置编码的正确位置。

我发现要让它工作,需要添加 OnDataBinding,如下所示,并确保代码隐藏文件中有一个处理程序,如下所示。

插入项目模板标记:

<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

我希望这可以帮助遇到同样问题的其他人。

【问题讨论】:

    标签: asp.net vb.net code-behind detailsview findcontrol


    【解决方案1】:

    我相信您想使用 Fields 属性而不是 FindControl。获得DataControlField 后,您可以将其转换为适当的控件类型(即CheckBoxField)。

    【讨论】:

    • 感谢您的回复。你能根据我们现有的代码展示示例编码吗?谢谢。
    • @Emad-ud-deen:当然可以,但是我需要查看更多代码才能提供此功能(这就是为什么我没有尝试在答案中这样做)。你能在你尝试使用它的上下文中显示代码吗?
    • 好的。我将编辑帖子以显示完整的子程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2022-01-14
    • 2012-08-07
    相关资源
    最近更新 更多