好的,我放弃了,我需要你的帮助。我觉得这很简单!
在这种情况下,部门属于机构。在我的SQL数据库中,它是一对多的关系。人民属于部门和机构。我正在编写一个页面,允许编辑一个人的详细信息,他们所属的部门根据他们所属的机构进行限制。例如,如果人力资源部门是机构A的一部分而财务部门是机构B的一部分,如果该人员在机构A中,除非您先将其移至机构B,否则他们不能属于财务部门。
我在FormView中有两个下拉列表,用于编辑此人的详细信息 - ddlEditInstitution
和ddlEditDepartment
。很简单,当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中的下拉列表。任何人都可以告诉我如何实现看似相对简单的效果吗?
答案 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