【问题标题】:Cascading DropDownList binding in ASP.Net DetailsView templated control not workingASP.Net DetailsView 模板化控件中的级联 DropDownList 绑定不起作用
【发布时间】:2022-01-14 17:19:25
【问题描述】:

我在 DetailsView 中有两个下拉列表,第一个下拉列表 DepartmentDropDown 使用以下数据源从后面的代码中成功加载数据

<asp:ObjectDataSource ID="dsDepartments" runat="server" SelectMethod="GetDepartments"
    TypeName="MyCode.DepartmentEmployeeAssociations">
</asp:ObjectDataSource>

第二个下拉列表EmployeeDropDown 使用基于第一个下拉列表中的部门选择的另一个数据源(注释代码有效并加载详细信息视图,但不加载控制参数代码):

<asp:ObjectDataSource ID="dsEmployees" runat="server" SelectMethod="GetAllEmployees"
    TypeName="MyCode.DepartmentEmployeeAssociations" DataObjectTypeName="Employee">
    <SelectParameters>
        <%--<asp:Parameter Name="deptId" Type="Int32" DefaultValue="7" />--%>
        <asp:ControlParameter ControlID="DepartmentDropDown" Name="deptId" PropertyName="SelectedValue" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

这是我的 GridView 和 DetailsView 中的代码

<asp:Panel ID="AssociationView" runat="server" Visible="false">
    <asp:GridView ID="gvAssociations" runat="server" AutoGenerateColumns="False" CssClass="GridViewStyle"
        EmptyDataText="No rules defined" Width="100%" AllowPaging="True" GridLines="None"
        DataKeyNames="Id" EnableModelValidation="True" DataSourceID="dsAssociations"
        OnSelectedIndexChanged="gvAssociations_SelectedIndexChanged">
        <Columns>
            <asp:CommandField ShowSelectButton="true" SelectText="View" ItemStyle-Width="50px">
                <ItemStyle Width="50px"></ItemStyle>
            </asp:CommandField>
            <asp:BoundField DataField="Id" HeaderText="Id" SortExpression="Id" Visible="False" />
            <asp:BoundField DataField="Value1" HeaderText="Employee" SortExpression="Value1" Visible="false" />
            <asp:BoundField DataField="Value1Description" HeaderText="Employee" NullDisplayText="*" />
            <asp:BoundField DataField="Value2" HeaderText="Department" SortExpression="Value2" Visible="false" />
            <asp:BoundField DataField="Value2Description" HeaderText="Department" NullDisplayText="*" />
            <asp:CommandField ShowDeleteButton="True" />
        </Columns>
    </asp:GridView>
    <div class="DetailsContainer">
        <asp:DetailsView ID="dvAssociations" runat="server" Height="50px" GridLines="None"
            CellPadding="5" AutoGenerateRows="False" DataKeyNames="sId" EnableModelValidation="True"
            OnItemCreated="dvAssociations_ItemCreated" OnItemUpdating="dvAssociations_ItemUpdating"
            OnItemInserting="dvAssociations_ItemInserting">
            <Fields>
                <asp:BoundField DataField="Id" HeaderText="ID" ReadOnly="True" InsertVisible="False" Visible="false" />                 
                <asp:TemplateField HeaderText="Department">
                    <ItemTemplate>
                        <asp:DropDownList ID="DepartmentDropDown" runat="server" SelectedValue='<%# Bind("Value2") %>'
                            DataSourceID="dsDepartments" DataValueField="DepartmentId" DataTextField="Name"
                            Enabled="false" AutoPostBack="true">
                        </asp:DropDownList>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="DepartmentDropDown" runat="server" SelectedValue='<%# Bind("Value2") %>'
                            DataSourceID="dsDepartments" DataValueField="DepartmentId" DataTextField="Name"
                            Enabled="true" AutoPostBack="true">
                        </asp:DropDownList>
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        <asp:DropDownList ID="DepartmentDropDown" runat="server" SelectedValue='<%# Bind("Value2") %>'
                            DataSourceID="dsDepartments" DataValueField="DepartmentId" DataTextField="Name"
                            Enabled="true" AutoPostBack="true">
                        </asp:DropDownList>
                    </InsertItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Employee">
                    <ItemTemplate>
                        <asp:DropDownList ID="EmployeeDropDown" runat="server"
                            DataSourceID="dsEmployees" DataValueField="EmployeeId" DataTextField="FullName"
                            Enabled="false">
                        </asp:DropDownList>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <asp:DropDownList ID="EmployeeDropDown" runat="server"
                            DataSourceID="dsEmployees" DataValueField="EmployeeId" DataTextField="FullName"
                            Enabled="true">
                        </asp:DropDownList>
                    </EditItemTemplate>
                    <InsertItemTemplate>
                        <asp:DropDownList ID="EmployeeDropDown" runat="server"
                            DataSourceID="dsEmployees" DataValueField="EmployeeId" DataTextField="FullName"
                            Enabled="true">
                        </asp:DropDownList>
                    </InsertItemTemplate>
                </asp:TemplateField>
                <asp:CommandField ShowEditButton="True" ShowInsertButton="True" ShowDeleteButton="True" />
            </Fields>
        </asp:DetailsView>
    </div>
</asp:Panel>

以及背后的代码:

protected void gvAssociations_SelectedIndexChanged(object sender, EventArgs e)
{
    dvAssociations.PageIndex = gvAssociations.SelectedRow.DataItemIndex;
}

protected void dvAssociations_ItemCreated(object sender, EventArgs e)
{
     if (dvAssociations.DataItem == null)
         return;
     // Some checks
}

protected void dvAssociations_ItemUpdating(object sender, DetailsViewUpdateEventArgs e)
{
    //some code
}
protected void dvAssociations_ItemInserting(object sender, DetailsViewUpdateEventArgs e)
{
    e.NewValues["Value1"] = ((DropDownList)((DetailsView)sender).FindControl("EmployeeDropDown")).SelectedValue;
}

public List<Department> GetDepartments()
{
  // code to return List<Department> departments
  // other code
  return departments;
}

public List<Employee> GetAllEmployees(int deptId)
{
  // code to return List<Employee> employees
  // other code
  return employees;
}

我尝试了其他 SO 文章中给出的各种建议,但仍然无法完成这项工作。当我添加了控制参数时,我的页面不加载,但如果我将其更改为普通参数,它就可以工作。

&lt;asp:ControlParameter ControlID="DepartmentDropDown" Name="deptId" PropertyName="SelectedValue" Type="Int32" /&gt;

我不确定它不喜欢什么,它似乎没有绑定详细信息视图中的数据。我按照其他帖子中的建议将AutoPostBack 添加到true 到第一个下拉列表中,并从第二个下拉列表中删除了SelectedValue='&lt;%# Bind("Value1") %&gt;',但似乎没有任何效果。

任何帮助将不胜感激。

【问题讨论】:

    标签: asp.net detailsview cascadingdropdown


    【解决方案1】:

    我终于让它工作了,这是一个愚蠢的错误,但我以前没有处理过这些 asp 组件。所以,这里有一些学习,希望这能帮助遇到类似问题的人。

    首先,请确保您在GridView中的数据是正确的,并且下拉列具有有效值并且在下拉列表源中。

    其次,我必须在 itemtemplate 中为员工移动我的ObjectDataSource

    <asp:TemplateField HeaderText="Employee">
        <ItemTemplate>
            <asp:DropDownList ID="EmployeeDropDown" runat="server" SelectedValue='<%# Bind("Value1") %>'
                DataSourceID="dsEmployees" DataValueField="EmployeeId" DataTextField="FullName" Enabled="false">
            </asp:DropDownList>
            <asp:ObjectDataSource ID="dsEmployees" runat="server" SelectMethod="GetAllEmployees"
                TypeName="MyCode.DepartmentEmployeeAssociations" DataObjectTypeName="Employee">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DepartmentDropDown" Name="deptId" PropertyName="SelectedValue" Type="Int32" />
                </SelectParameters>
            </asp:ObjectDataSource>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:DropDownList ID="EmployeeDropDown" runat="server" SelectedValue='<%# DataBinder.Eval (Container.DataItem, "Value1") %>'
                DataSourceID="dsEmployees" DataValueField="EmployeeId" DataTextField="FullName"
                Enabled="true">
            </asp:DropDownList>
            <asp:ObjectDataSource ID="dsEmployees" runat="server" SelectMethod="GetAllEmployees"
                TypeName="MyCode.DepartmentEmployeeAssociations" DataObjectTypeName="Employee">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DepartmentDropDown" Name="deptId" PropertyName="SelectedValue" Type="Int32" />
                </SelectParameters>
            </asp:ObjectDataSource>
        </EditItemTemplate>
        <InsertItemTemplate>
            <asp:DropDownList ID="EmployeeDropDown" runat="server" SelectedValue='<%# DataBinder.Eval (Container.DataItem, "Value1") %>'
                DataSourceID="dsEmployees" DataValueField="EmployeeId" DataTextField="FullName"
                Enabled="true">
            </asp:DropDownList>
            <asp:ObjectDataSource ID="dsEmployees" runat="server" SelectMethod="GetAllEmployees"
                TypeName="MyCode.DepartmentEmployeeAssociations" DataObjectTypeName="Employee">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DepartmentDropDown" Name="deptId" PropertyName="SelectedValue" Type="Int32" />
                </SelectParameters>
            </asp:ObjectDataSource>
        </InsertItemTemplate>                        
    </asp:TemplateField>
    

    另外,我在 EmployeeDropDown aspx 代码中将 SelectedValue='&lt;%# Bind("Value1") %&gt;' 替换为 SelectedValue='&lt;%# DataBinder.Eval (Container.DataItem, "Value1") %&gt;' 以使其更简单。这意味着,无需将此事件处理程序 dvAssociations_ItemInserting 添加到 DetailsView

    但是,我有另一个与网格中的孤立数据相关的问题,该问题在下拉列表中不存在 - 这导致 ItemTemplate 无法加载。那是另一个帖子,这个帖子现在完成了。希望对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多