1

我正在开发一个网页,该网页将利用两个级联下拉列表和一个包含嵌套网格视图的更新面板。

我已经设法让级联下拉列表正常工作,并且我还设法让我的嵌套网格视图正常工作。

下一步是根据第二个级联下拉列表的选择来填充网格视图,这是更新面板发挥作用的地方。我想一旦选择了第二个下拉列表,我就可以刷新更新面板并加载我的嵌套网格视图。查看文档,我意识到我需要某种触发器来强制更新面板重新加载,但我一定没有正确地做某事......

在我的更新面板中,我使用了 trigger 参数,其中cddMachine是第二个下拉列表的名称。

<Triggers>
    <asp:AsyncPortBackTrigger ControlID="cddMachine" EventName="SelectedIndexChanged" />
</Triggers>

运行我的代码时,会引发以下错误:

Control with ID 'cddMachine' being registered through 
RegisterAsyncPostBackControl or RegisterPostBackControl must implement either
INamingContainer, IPostBackDataHandler, or IPostBackEventHandler

搜索了一段时间后,我找不到任何关于如何通过级联下拉列表刷新更新面板的明确信息。我确定我忽略了一些简单的东西,但我不确定我需要寻找什么。

编辑- 包含的代码

锁定.aspx

<%@ Page Title="" Language="vb" AutoEventWireup="true" MasterPageFile="~/Site.Master" CodeBehind="Lockout.aspx.vb" Inherits="LockoutTagout.Lockout" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>


<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<asp:ScriptManager ID="asm" runat="server" />
<div>
    Complex:
    <asp:DropDownList ID="ComplexList" runat="server" />
    &nbsp;&nbsp; Machine:
    <asp:DropDownList ID="MachineList" runat="server" AutoPostBack="true" />

    <asp:CascadingDropDown ID="cddComplex" runat="server"
        ServicePath="~/lockoutService.asmx" ServiceMethod="GetComplex"
        TargetControlID="ComplexList" Category="Complex"
        PromptText="Select Complex" />

    <asp:CascadingDropDown ID="cddMachine" runat="server"
        ServicePath="~/lockoutService.asmx" ServiceMethod="GetMachine"
        TargetControlID="MachineList" ParentControlID="ComplexList"
        Category="Machine" PromptText="Select Machine" />
</div>

<div>
    <asp:UpdatePanel runat="server">
        <ContentTemplate>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ ConnectionStrings:LOTOConnectionString %>"
                SelectCommand="SELECT * FROM [DEVICES] WHERE machine_id = @machine_id">
                <SelectParameters>
                    <asp:ControlParameter Name="machine_id" ControlID="cddMachine" PropertyName="SelectedValue" />
                </SelectParameters>
            </asp:SqlDataSource>
            <asp:GridView ID="GridView1" GridLines="None" runat="server" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="devices_id" DataSourceID="SqlDataSource1" AlternatingRowStyle-BackColor="White">
                <Columns>
                    <asp:BoundField DataField="devices_id" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="devices_id" />
                    <asp:BoundField ItemStyle-HorizontalAlign="Center" DataField="description" HeaderText="Description" SortExpression="description" />
                    <asp:BoundField ItemStyle-HorizontalAlign="Center" DataField="location" HeaderText="Location" SortExpression="location" />
                    <asp:BoundField ItemStyle-HorizontalAlign="Center" DataField="verification" HeaderText="Verification" SortExpression="verification" />
                    <asp:BoundField ItemStyle-HorizontalAlign="Center" DataField="rack_num" HeaderText="Rack_#" SortExpression="rack_num" />
                    <asp:BoundField ItemStyle-HorizontalAlign="Center" DataField="section_num" HeaderText="Section_#" SortExpression="section_num" />
                    <asp:BoundField ItemStyle-HorizontalAlign="Center" DataField="color_or_number" HeaderText="Key_Identifier" SortExpression="color_or_number" />
                    <asp:BoundField ItemStyle-HorizontalAlign="Center" DataField="normal_position" HeaderText="Normal_Position" SortExpression="normal_position" />
                    <asp:TemplateField HeaderText="P&amp;P Numbers" ControlStyle-Width="100px">
                        <ItemTemplate>
                            <asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:LOTOConnectionString %>" SelectCommand="SELECT * FROM [PNP] WHERE ([devices_id] = @devices_id)">
                                <SelectParameters>
                                    <asp:Parameter Name="devices_id" Type="Int32" />
                                </SelectParameters>
                            </asp:SqlDataSource>
                            <asp:GridView ID="GridView2" ShowHeader="false" GridLines="None" runat="server" AutoGenerateColumns="False" DataKeyNames="pnp_id" DataSourceID="SqlDataSource2">
                                <Columns>
                                    <asp:BoundField ItemStyle-HorizontalAlign="Center" DataField="pnp_num" HeaderText="pnp_num" SortExpression="pnp_num" />
                                </Columns>
                            </asp:GridView>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
                <HeaderStyle BackColor="#a52138" ForeColor="White" Font-Size="Medium" />
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

锁定.aspx.vb

Public Class Lockout
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load, MachineList.SelectedIndexChanged

End Sub

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim s As SqlDataSource = CType(e.Row.FindControl("SqlDataSource2"), SqlDataSource)
        s.SelectParameters(0).DefaultValue = e.Row.Cells(0).Text
    End If
End Sub
End Class

lockoutService.asmx.vb

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports AjaxControlToolkit
Imports System.Data.SqlClient

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class lockoutService
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function GetComplex(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
    Dim conn As New SqlConnection("Data Source=WIWRMS-SQLD2\SQLD2;Initial Catalog=LOTO;Persist Security Info=True;User ID=LOTO_ADMIN;Password=lotoadmin")
    conn.Open()
    Dim comm As New SqlCommand( _
        "SELECT * FROM complex", conn)
    Dim dr As SqlDataReader = comm.ExecuteReader()
    Dim l As New List(Of CascadingDropDownNameValue)
    While (dr.Read())
        l.Add(New CascadingDropDownNameValue(dr("complex_name").ToString(), dr("complex_id").ToString()))
    End While
    conn.Close()
    Return l.ToArray()
End Function

<WebMethod()> _
Public Function GetMachine(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
    Dim complex_id As Integer
    Dim kv As StringDictionary = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)

    If Not kv.ContainsKey("complex") Or Not Int32.TryParse(kv("complex"), complex_id) Then
        Throw New ArgumentException("Couldn't find complex.")
    End If

    Dim conn As New SqlConnection("Data Source=WIWRMS-SQLD2\SQLD2;Initial Catalog=LOTO;Persist Security Info=True;User ID=LOTO_ADMIN;Password=lotoadmin")
    conn.Open()
    Dim comm As New SqlCommand( _
        "SELECT * FROM machine WHERE complex_id = @complex_id", conn)
    comm.Parameters.AddWithValue("@complex_id", complex_id)
    Dim dr As SqlDataReader = comm.ExecuteReader()
    Dim l As New List(Of CascadingDropDownNameValue)
    While (dr.Read())
        l.Add(New CascadingDropDownNameValue(dr("machine_name").ToString(), dr("machine_id").ToString()))
    End While
    conn.Close()
    Return l.ToArray()
End Function
End Class
4

1 回答 1

1

ACascadingDropDown实际上只是 a 上的扩展器DropDownList,因此您应该能够删除触发器,将 finalDropDownListAutoPostBack属性设置为 true,然后处理其SelectedIndexChanged事件。这应该会自动触发,PartialPostBack以便您可以相应地更新您的GridView

修复的其他详细信息:

我想您可能想在 DataSource 标记中更改以下内容:<asp:ControlParameter Name="machine_id" ControlID="cddMachine" PropertyName="SelectedValue" />更改ControlIDMachineList.

于 2013-07-18T16:14:53.653 回答