1

我正在開發一個網頁,將利用兩個級聯下拉列表和更新面板,其中包含嵌套的gridview。刷新更新面板從級聯下拉列表

我設法讓層疊下拉列表正常工作,並且我也設法讓我的嵌套gridview工作。

下一步是基於第二個級聯下拉列表的選擇填充gridview,這是更新面板進入的地方。我想,一旦選擇了第二個下拉列表,我可以刷新更新面板並加載我的嵌套網格視圖。通過文檔查看,我意識到我需要某種觸發器來強制更新面板重新加載,但我不能做正確的事情......

在我的更新面板中,我使用觸發器參數,其中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 

回答

1

一個CascadingDropDown其實只是一個DropDownList的擴展,所以你應該能夠去除觸發,設置你的最終DropDownListAutoPostBack屬性爲true,那麼處理其SelectedIndexChanged事件。這應該會自動觸發PartialPostBack,以便您可以相應地更新GridView

用於修復的更多細節:

我想你可能要改變你的數據源標記如下:<asp:ControlParameter Name="machine_id" ControlID="cddMachine" PropertyName="SelectedValue" />變化ControlIDMachineList

+0

當我刪除觸發器並啓用autopostback時,我得到一個有關無效回發參數的新錯誤。 – kubiej21

+0

下面是關於發生這種情況的原因的討論:http://odetocode.com/Blogs/scott/archive/2006/03/21/asp-net-event-validation-and-invalid-callback-or-postback-argument.aspx並在這裏討論解決方案:http://odetocode.com/blogs/scott/archive/2006/03/21/asp-net-event-validation-and-invalid-callback-or-postback-argument-again。aspx –

+0

在玩了一段時間之後,我似乎發回了下拉列表的文本,而不是id。 (machine_name與machine_id)任何想法,爲什麼這可能是? – kubiej21