【问题标题】:Databound Child Master Dropdownlist数据绑定子主下拉列表
【发布时间】:2014-05-06 09:51:47
【问题描述】:

好吧,我放弃了,我需要你的帮助。我以为这很简单!

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

我在 FormView 中有两个下拉列表,用于编辑人员的详细信息 - ddlEditInstitutionddlEditDepartment。很简单,当 FormView 第一次进入编辑模式时,我希望这两个下拉列表显示该人当前所属的机构和部门。如果您单击部门下拉列表,您将只能从属于该机构的部门中进行选择。如果您更改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 不显示 Person 的当前部门,而是显示下拉列表项目中的第一个部门。这是有道理的 - 我没有设置 ddlEditDepartment 的 SelectedValue。但是,如果我这样做(就像我最初所做的那样,当我认为这很容易时)通过在页面标记中将属性添加到 ddlEditDepartment ,就像这样......

SelectedValue = '&lt;%# Bind("DepartmentID")%&gt;'

...然后发生的情况是,如果您从 ddlInstitution 中选择不同的选项,ddlDepartment 的数据绑定项不会更新。它们仍然是与旧机构相关的选项。这可能是因为 ddlEditDepartment 的 SelectedValue 属性覆盖了其他所有内容 - 下拉列表无论如何都绑定到该列。

我已经尝试通过我能想到的所有方式来解决这个问题,通过在更改 ddlEditInstitution 时手动更改代码后面的 ddlEditDepartment 的 SelectedValue,尝试将代码后面的 ddlEditDepartment 的 SelectedValue 设置为当 FormView 第一次进入编辑模式而不是显式地进入编辑模式时,人的当前部门......但没有任何作用。

我讨厌 ASP.NET 中的下拉列表。谁能告诉我如何实现看起来相对简单的效果?

【问题讨论】:

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


    【解决方案1】:

    终于想出了一个办法。在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2023-03-13
      相关资源
      最近更新 更多