asp.net – 在模板化控件中实现级联DropDownList绑定

前端之家收集整理的这篇文章主要介绍了asp.net – 在模板化控件中实现级联DropDownList绑定前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的表单上有2个DropDownList控件,第二个控件使用第一个的SelectedValue作为其绑定参数之一.

DropDownList控件都在FormView.InsertItemTemplate中,其SelectedValue属性使用绑定表达式绑定到FormView的数据源.

FormView第一次在插入模式下渲染,一切正常.问题是在第一个DropDownList的AutoPostBack之后,FormView没有(重新)绑定,但是由于第二个DropDownList上的ControlParameter已经改变,它会绑定(按预期),但是绑定表达式上发生异常.第二个DDL,我假设因为FormView没有绑定该传递:

System.InvalidOperationException: Databinding methods such as Eval(),
XPath(),and Bind() can only be used in the context of a databound
control.

这是标记

<InsertItemTemplate>
.
.
.
<tr class="GridViewRowB">
                    <td class="GridViewCell">
                        Offense Type
                    </td>
                    <td class="GridViewCell">
                        <asp:DropDownList ID="ddlOffenseType" runat="server" DataSourceID="dsOffenseType"
                            AutoPostBack="true" DataValueField="OffenseTypeID" DataTextField="Description"
                            SelectedValue='<%# Bind("OffenseTypeID") %>'>
                        </asp:DropDownList>
                        <asp:ObjectDataSource ID="dsOffenseType" runat="server" TypeName="OffenseType"
                            SelectMethod="GetAll">
                            <SelectParameters>
                                <asp:Parameter Name="ActiveOnly" DefaultValue="True" Type="Boolean" />
                            </SelectParameters>
                        </asp:ObjectDataSource>
                    </td>
                </tr>
                <tr class="GridViewRowA">
                    <td class="GridViewCell">
                        Attorney
                    </td>
                    <td class="GridViewCell">
                        <asp:DropDownList ID="ddlAttorney" runat="server" DataSourceID="dsAttorney" DataValueField="AttorneyID"
                            DataTextField="AttorneyNameWithCount" SelectedValue='<%# Bind("AttorneyID") %>'>
                        </asp:DropDownList>
                        <asp:ObjectDataSource ID="dsAttorney" runat="server" TypeName="Attorney"
                            SelectMethod="GetAttorneyWithCaseCount">
                            <SelectParameters>
                                <asp:Parameter Name="ActiveOnly" DefaultValue="True" Type="Boolean" />
                                <asp:ControlParameter Name="OffenseTypeID" Type="Int32" ControlID="ddlOffenseType"
                                    PropertyName="SelectedValue" />
                            </SelectParameters>
                        </asp:ObjectDataSource>
                    </td>
                </tr>
.
.
.
</InsertItemTemplate>

我的问题是:使这项功能有效的最佳方法是什么?是否可以将两个DDL保留在模板中?我宁愿避免使用AJAX工具包或其他客户端解决方案.

解决方法

当我们在像像DetailsView / FormView这样的数据绑定控件中使用级联下拉列表时,这是一个问题,而且我已多次面对它.您必须从第二个下拉列表中删除绑定表达式SelectedValue =’<%#Bind(“AttorneyID”)%>‘,然后它将起作用.

其次,如果删除Binding表达式,则必须在FormView ItemInserting Event中手动传递值.例如

protected void frmAsset_ItemInserting(object sender,FormViewInsertEventArgs e)
 {
    eValues["AttorneyID"] = ((DropDownList)((FormView)sender).FindControl("ddlAttorny")).SelectedValue;
 }

猜你在找的asp.Net相关文章