我的表单上有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; }