Databound Child Master下拉列表

时间:2014-05-06 09:51:48

标签: asp.net vb.net drop-down-menu

好的,我放弃了,我需要你的帮助。我觉得这很简单!

在这种情况下,部门属于机构。在我的SQL数据库中,它是一对多的关系。人民属于部门和机构。我正在编写一个页面,允许编辑一个人的详细信息,他们所属的部门根据他们所属的机构进行限制。例如,如果人力资源部门是机构A的一部分而财务部门是机构B的一部分,如果该人员在机构A中,除非您先将其移至机构B,否则他们不能属于财务部门。

我在FormView中有两个下拉列表,用于编辑此人的详细信息 - ddlEditInstitutionddlEditDepartment。很简单,当FormView首次进入编辑模式时,我希望这两个下拉列表显示该Person当前所属的机构和部门。如果单击“部门”下拉列表,您将只能从属于该机构的部门中进行选择。如果您更改ddlInstitution中的机构,则ddlDepartment中的可用选项应刷新为仅显示属于新选择的机构的部门。

对,一些代码。这是我对下拉列表的加分:

<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属性覆盖了其他所有内容 - 无论如何,下拉列表都绑定到该列。

我尝试通过尝试设置{的{Value}来更改ddlEditDepartment后代码中ddlEditInstitution的{​​{1}}的SelectedValue,尝试绕过这个方法。当FormView首次进入编辑模式而非显式进入编辑模式时,代码隐藏在人员当前部门的代码中{1}}但是没有任何作用。

我讨厌ASP.NET中的下拉列表。任何人都可以告诉我如何实现看似相对简单的效果吗?

1 个答案:

答案 0 :(得分: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