在模板化控件中实现级联 DropDownList 绑定
我的表单上有 2 个 DropDownList
控件,其中第二个控件使用第一个控件的 SelectedValue
作为其绑定参数之一。
两个 DropDownList
控件均位于 FormView.InsertItemTemplate
中,并使用 Binding 将 SelectedValue
属性绑定到 FormView
的数据源表达。
第一次 FormView
在插入模式下呈现时,一切正常。问题是在第一个 DropDownList
执行 AutoPostBack
之后,FormView
不会(重新)绑定,但是由于 ControlParameter第二个
已更改,它确实绑定(按预期),但第二个 DDL 的绑定表达式上发生异常,我假设是因为 DropDownList
上的FormView
> 不具有约束力在该通行证上:
System.InvalidOperationException:数据绑定方法,例如 Eval()、 XPath() 和 Bind() 只能在数据绑定的上下文中使用 控制。
这是标记:
<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 工具包或其他客户端解决方案。
I have 2 DropDownList
controls on my form, the second of which uses the SelectedValue
of the first as one of its binding parameters.
Both DropDownList
controls are in a FormView.InsertItemTemplate
with SelectedValue
properties bound to the FormView
's datasource using a Binding Expression.
The first time the FormView
renders in Insert mode, everything works fine. The problem is after an AutoPostBack
from the first DropDownList
, the FormView
doesn't (re-)bind, however since the ControlParameter
on the second DropDownList
has changed, it DOES bind (as intended), but an exception occurs on the Binding Expression of the second DDL, I assume since the FormView
is not binding on that pass:
System.InvalidOperationException: Databinding methods such as Eval(),
XPath(), and Bind() can only be used in the context of a databound
control.
Here is the markup:
<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>
My question is: What is the best way to make this functionality work? Is it possible to keep both DDL's inside the template? I would prefer to avoid using the AJAX toolkit or other client-side solutions.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
当我们在数据绑定控件(如
DetailsView/FormView
)中使用级联下拉列表时,这是一个问题,我已经遇到过很多次了。您必须从第二个下拉列表SelectedValue='<%# Bind("AttorneyID") %>'
中删除绑定表达式,然后它才会起作用。其次,如果删除 Binding 表达式,则必须在 FormView
ItemInserting
事件中手动传递值。例如This is an issue when we use cascading dropdownlist in Databinding Controls like
DetailsView/FormView
and I have faced it many times. You have to remove the Binding Expression from your Second DropdownlistSelectedValue='<%# Bind("AttorneyID") %>'
, then it will work.Secondly if you remove the Binding expression, you have to pass the value manually in FormView
ItemInserting
Event. e.g.实际上,我发布这个答案是为了防止其他人像我一样陷入困境。
穆罕默德·阿赫塔尔所说的非常有效,但是我找到了一个更简单的解决方案。
将
Bind("AttorneyID")
更改为DataBinder.Eval (Container.DataItem, "AttorneyID")
它工作完美!
编辑:我的示例代码:
Actually I'm posting this answer in case anybody else got stuck like I did.
What Muhammad Akhtar said works perfectly, however I found a simpler solution.
In
change
Bind("AttorneyID")
toDataBinder.Eval (Container.DataItem, "AttorneyID")
It works perfectly!
EDIT: My sample code:
这可能来得有点晚,但迟到总比不到好:
我针对详细信息视图的 ItemUpdating 事件测试了它,但我认为它适用于表单视图,只需切换您需要的部分,它就会工作。
编辑:您可以检查此参考:
http://msdn.microsoft.com /en-us/library/system.web.ui.webcontrols.detailsview.itemupdating.aspx
This may come a little bit late but better late than never:
I tested this for the event ItemUpdating of a details view but I think it will work for a formview, just switch the parts you need and it will work.
Edit: You can check this reference:
http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.detailsview.itemupdating.aspx
我是这样做的......
Here is how I did it...