【问题标题】:Dropdown list change based on other dropdown list in details view ASP.NET下拉列表更改基于详细信息视图 ASP.NET 中的其他下拉列表
【发布时间】:2016-11-03 17:08:40
【问题描述】:

我在详细信息视图中有两个下拉列表,一个名为 College,另一个是 Department。如果用户选择一所大学,则部门下拉列表应生成所选大学的所有部门。

这是详细信息视图和下拉列表:

    <asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="600px" AutoGenerateRows="False" CssClass="table table-bordered mtop" DataKeyNames="ID" DataSourceID="SqlDataSource1" OnDataBound="DetailsView1_DataBound">
                <FieldHeaderStyle CssClass="DetailsViewHeader" Width="200px" />
                <Fields>

                  <asp:TemplateField HeaderText="College" SortExpression="Colleges">
                        <EditItemTemplate>
                            <asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="SqlDataSource3" DataTextField="ArName" DataValueField="Code"></asp:DropDownList>
                            <asp:HiddenField ID="HiddenColl" runat="server" value='<%# Eval("Colleges") %>' /> 
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label15" runat="server" Text='<%# Bind("Colleges") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>

                  <asp:TemplateField HeaderText="Department" SortExpression="ArName">
                        <EditItemTemplate>
                            <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="SqlDataSource2" DataTextField="ArName" DataValueField="Code"></asp:DropDownList>
                            <asp:HiddenField ID="HiddenDep" runat="server" value='<%# Eval("ArName") %>' />                       
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="Label11" runat="server" Text='<%# Bind("ArName") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>

                   <asp:TemplateField ShowHeader="False">
                        <EditItemTemplate>
                            <asp:Button ID="Button1" runat="server" CausesValidation="True" CommandName="Update" Text="Update" />
                            &nbsp;<asp:Button ID="Button2" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" />
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Button ID="Button1" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit" />
                            &nbsp;<asp:Button ID="btnDelete" runat="server" CausesValidation="False" Text="Delete"  OnClientClick="return confirm('Do you want to delete ?');" OnClick="btnDelete_Click" />
                        </ItemTemplate>
                        <ControlStyle CssClass="btn-login" />
                        <ItemStyle CssClass="text-center" />
                    </asp:TemplateField>

           </Fields>
        </asp:DetailsView>

这里是 SqlDataSources:

<asp:SqlDataSource ID="SqlDataSource3" runat="server" ConnectionString="<%$ ConnectionStrings:UEDConnectionStringMarwaMarwa %>" SelectCommand="SELECT [ArName], [Code] FROM [College]"></asp:SqlDataSource>

<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:UEDConnectionStringMarwaMarwa %>" SelectCommand="SELECT [Code], [ArName] FROM [Department] WHERE ([CollegeCode] = @CollegeCode)">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DetailsView1$DropDownList2" Name="CollegeCode" PropertyName="SelectedValue" Type="Int32" />
                </SelectParameters>
</asp:SqlDataSource>

这是错误信息:

在中找不到控件“DetailsView1$DropDownList2” ControlParameter 'CollegeCode'

我这样做了DetailsView1$DropDownList2,所以它可以访问详细信息视图中的下拉列表

有什么问题?

【问题讨论】:

  • 在您的第一个下拉列表中设置 Autopostback=true,您可能需要在编辑项模板中包含 sql 数据源
  • 这看起来像是模板控件的级联下拉列表的一个很好的干净示例stackoverflow.com/questions/6749944/…

标签: asp.net dropdown detailsview


【解决方案1】:

我不熟悉DetailsView,也没有使用过SqlDataSource,但我会尽力提供帮助。

根据我的经验,我了解到您不应该尝试假设控件的ClientID。因此,首先我建议从服务器控件中获取ClientID。 使用内联表达式,我会尝试这样的事情:

<asp:ControlParameter ControlID='<%= DetailsView1.Rows(0).FindControl("DropDownList2").ClientID %>' Name="CollegeCode" PropertyName="SelectedValue" Type="Int32" />

有关 asp.net 内联表达式的更多信息,请参阅Introduction to ASP.NET inline expressions in the .NET Framework

因为我对DetailsView控件不熟悉,所以不知道在执行这个内联表达式的时候DetailsView的索引0处是否会有一行(会抛出异常)。

如果该代码不起作用,我建议在绑定DetailsView1 行之后执行的后端动态设置ControlID(例如在DetailsView1DataBound 事件方法内) .

VB:

If DetailsView1.Rows.Count > 0 Then
    Dim objDropDownList2 as Control = DetailsView1.Rows(0).FindControl("DropDownList2")
    If objDropDownList2 IsNot Nothing Then
        SqlDataSource1.SelectParameters("CollegeCode").ControlID = objDropDownList2.ClientID
    End If  
End If

C#:

if (DetailsView1.Rows.Count > 0) {
    Control objDropDownList2 = DetailsView1.Rows(0).FindControl("DropDownList2");
    if (objDropDownList2 != null) {
        SqlDataSource1.SelectParameters("CollegeCode").ControlID = objDropDownList2.ClientID;
    }
}

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    相关资源
    最近更新 更多