【问题标题】:refresh update panel from cascading drop down list从级联下拉列表刷新更新面板
【发布时间】:2013-07-18 16:08:15
【问题描述】:

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

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

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

在我的更新面板中,我使用了 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

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

编辑 - 包含的代码

lockout.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>

lockout.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

【问题讨论】:

    标签: asp.net updatepanel ajaxcontroltoolkit cascadingdropdown


    【解决方案1】:

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

    其他修复细节:

    我认为您可能希望在 DataSource 标记中更改以下内容:&lt;asp:ControlParameter Name="machine_id" ControlID="cddMachine" PropertyName="SelectedValue" /&gt; 将 ControlID 更改为 MachineList。

    【讨论】:

    • 当我删除触发器并启用自动回发时,我收到一个关于无效回发参数的新错误。
    • 这里讨论了为什么会这样:odetocode.com/Blogs/scott/archive/2006/03/21/…这里讨论了解决方案:odetocode.com/blogs/scott/archive/2006/03/21/…
    • 玩了一会之后,似乎我正在回发下拉列表的文本,而不是 id。 (machine_name vs. machine_id) 知道为什么会这样吗?
    • 可能您未正确绑定到 DDL。你能发布你用来处理数据的代码吗?我们可以看看。
    • 已添加代码。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 2011-06-17
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多