2014-05-06 86 views
0

好吧,我放棄了,我需要你的幫助。我認爲這很簡單!Databound Child Master Dropdownlist

在這種情況下,部門屬於機構。在我的SQL數據庫中,它是一對多的關係。人屬於部門和機構。我正在編寫一個頁面,允許編輯個人詳細信息,其所屬部門根據其所屬機構進行限制。例如,如果人力資源部門是機構A的一部分,財務部門是機構B的一部分,如果人員在機構A中,除非您先將其移至機構B,否則他們不能屬於財務部門。

I在FormView中有兩個下拉列表來編輯個人的詳細信息 - ddlEditInstitutionddlEditDepartment。很簡單,當FormView首先進入編輯模式時,我希望這兩個下拉列表顯示當前所屬的機構和部門。如果您單擊部門下拉列表,您將只能從屬於該機構的部門中進行選擇。如果您更改了ddlInstitution中的機構,則ddlDepartment中的可用選項應刷新爲僅顯示屬於新選機構的部門。

對,有些代碼。這是我的加價爲dropdownlists:

<tr> 
    <td class="fieldlabel">Institution</td>         
    <td><asp:DropDownList ID="ddlEditInstitution" runat="server" DataTextField="Name" DataValueField="ID" DataSourceID="SQLInstitution" SelectedValue='<%# Bind("InstitutionID")%>' CssClass="contactdetailseditfield" 
     AutoPostBack="True" OnSelectedIndexChanged="ddlEditInstitution_SelectedIndexChanged" /></td> 
    <asp:SqlDataSource ID="SQLInstitution" runat="server" ConnectionString="<%$ ConnectionStrings:ContactsConnectionString %>" 
     SelectCommand="SELECT * FROM [Institution] WHERE ([Deleted] = 0)" /> 
</tr> 
<tr> 
    <td class="fieldlabel">Department</td> 
     <td><asp:UpdatePanel ID="upDepartment" runat="server" UpdateMode="conditional"> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="ddlEditInstitution" EventName="SelectedIndexChanged" /> 
      </Triggers> 
      <ContentTemplate> 
      <asp:DropDownList ID="ddlEditDepartment" runat="server" DataTextField="Name" DataValueField="ID" DataSourceID="SQLDepartment" CssClass="contactdetailseditfield" /> 
      <asp:SqlDataSource ID="SQLDepartment" runat="server" ConnectionString="<%$ ConnectionStrings:ContactsConnectionString %>" 
       SelectCommand="SELECT * FROM [Department] WHERE ([Deleted] = 0) AND (Institution = @InstitutionID)"> 
       <SelectParameters> 
        <asp:ControlParameter ControlID="ddlEditInstitution" PropertyName="SelectedValue" Name="InstitutionID" Type="Int32" /> 
       </SelectParameters> 
      </asp:SqlDataSource> 
     </ContentTemplate> 
    </asp:UpdatePanel></td>         
</tr> 

而這裏的代碼背後:

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

    ddlEditDepartment.SelectedValue = Nothing 
     ddlEditDepartment.Items.Clear() 
     ddlEditDepartment.DataBind() 
     ddlEditDepartment.Items.Insert(0, New ListItem("--Select a department--", "-1")) 
     ddlEditDepartment.SelectedIndex = 0 

End Sub 

這種近乎完美的作品。問題是,當FormView第一次進入編輯模式時,ddlEditDepartment不顯示該人的當前部門,它顯示下拉列表項目中的第一個部門。這是有道理的 - 我沒有設置ddlEditDepartment的SelectedValue。但是,如果我這樣做(像我一樣原來,當我認爲這將是容易)通過添加屬性ddlEditDepartment在頁面標記,就像這樣......

SelectedValue = '<%# Bind("DepartmentID")%>'

...那麼會發生什麼情況是,如果從ddlInstitution中選擇不同的選項,則ddlDepartment的數據綁定項不會更新。它們仍然是與舊機構相關的選擇。大概這是因爲ddlEditDepartment的SelectedValue屬性重寫了其他所有內容 - 無論如何,下拉列表都綁定到該列。

我試圖讓周圍這種每哪種方式改變ddlEditInstitution時,試圖通過設定的ddlEditDepartment的的SelectedValue代碼背後的人的電流時,系我能想到的,在代碼中手動改變ddlEditDepartment的的SelectedValue背後FormView首先進入編輯模式,而不是顯式的......但沒有任何效果。

我討厭ASP.NET中的dropdownlists。任何人都可以告訴我如何實現看起來相對簡單的效果?

回答

0

終於想出了辦法做到這一點。在FormView的DataBound事件中,如果它處於編輯模式,我手動獲取Person的當前部門並將ddlEditDepartment設置爲該值。

Protected Sub fvContactDetails_DataBound(sender As Object, e As EventArgs) Handles fvContactDetails.DataBound 

    Dim dept As Integer = DataBinder.Eval(fvContactDetails.DataItem, "DepartmentID") 
    If fvContactDetails.CurrentMode = FormViewMode.Edit Then 
     ddlEditDepartment.SelectedValue = dept 
    End If 

End Sub