Asp.net 在模板控件中实现级联DropDownList绑定
我的表单上有2个Asp.net 在模板控件中实现级联DropDownList绑定,asp.net,drop-down-menu,formview,Asp.net,Drop Down Menu,Formview,我的表单上有2个DropDownList控件,第二个控件使用第一个控件的SelectedValue作为其绑定参数之一 这两个DropDownList控件都位于FormView中。InsertItemTemplate使用绑定表达式将SelectedValue属性绑定到FormView的数据源 FormView第一次以插入模式呈现时,一切正常。问题是在从第一个DropDownList执行AutoPostBack后,FormView不会(重新)绑定,但是由于第二个DropDownList上的Contr
DropDownList
控件,第二个控件使用第一个控件的SelectedValue
作为其绑定参数之一
这两个DropDownList
控件都位于FormView中。InsertItemTemplate
使用绑定表达式将SelectedValue
属性绑定到FormView
的数据源
FormView
第一次以插入模式呈现时,一切正常。问题是在从第一个DropDownList
执行AutoPostBack
后,FormView
不会(重新)绑定,但是由于第二个DropDownList
上的ControlParameter
已更改,它会绑定(如预期的那样),但第二个DDL的绑定表达式会发生异常,我假设由于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工具包或其他客户端解决方案。当我们在数据绑定控件(如
DetailsView/FormView
中使用级联dropdownlist)时,这是一个问题,我已经多次遇到过这个问题。您必须从第二个下拉列表中删除绑定表达式SelectedValue='
,然后它才能工作
其次,如果删除绑定表达式,则必须在FormViewItemInserting
事件中手动传递值。e、 g
protected void frmAsset_ItemInserting(object sender, FormViewInsertEventArgs e)
{
eValues["AttorneyID"] = ((DropDownList)((FormView)sender).FindControl("ddlAttorny")).SelectedValue;
}
这可能来得有点晚,但迟做总比不做好:
Protected Sub DetailsView1_ItemUpdating(sender As Object, e As System.Web.UI.WebControls.DetailsViewUpdateEventArgs) Handles DetailsView1.ItemUpdating
e.NewValues("AtendeeSubType") = DirectCast(DirectCast(sender, DetailsView).FindControl("dropdownlist3"), DropDownList).SelectedValue
End Sub
我对细节视图的事件项更新进行了测试,但我认为它对formview有效,只需切换所需的部分即可
编辑:您可以检查此引用:
事实上,我正在发布这个答案,以防其他人像我一样陷入困境。 穆罕默德·阿赫塔所说的非常有效,但我找到了一个更简单的解决方案。
在
以下是我是如何做到的
<asp:SqlDataSource ID="sqldsDDPlant" runat="server" ConnectionString="<%$ ConnectionStrings:SeedTrackerConnectionString %>"
SelectCommand="SELECT * FROM [Plant] ORDER BY [Plant]"></asp:SqlDataSource>
<asp:SqlDataSource ID="sqldsDDType" runat="server" ConnectionString="<%$ ConnectionStrings:SeedTrackerConnectionString %>"
SelectCommand="SELECT * FROM [Type] ORDER BY [Type]" FilterExpression="PLID = '{0}'">
<FilterParameters>
<asp:ControlParameter Name="plantParam" ControlID="DVSeedTracker$ddPlant" PropertyName="SelectedValue" />
</FilterParameters>
</asp:SqlDataSource>
<asp:TemplateField HeaderText="Plant">
<InsertItemTemplate>
<asp:DropDownList ID="ddPlant" runat="server" AutoPostBack="true" SelectedValue='<%# Bind("PLID") %>'
DataSourceID="sqldsDDPlant" DataTextField="Plant" DataValueField="PLID" AppendDataBoundItems="True">
<asp:ListItem></asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator
id="RequiredFieldValidator2"
runat="server"
ControlToValidate="ddPlant"
Display="Static"
ErrorMessage="*Required" CssClass="RequiredField" />
</InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Type">
<InsertItemTemplate>
<asp:DropDownList ID="ddType" runat="server"
DataSourceID="sqldsDDType" DataTextField="Type" DataValueField="TYPID" AppendDataBoundItems="False">
<asp:ListItem></asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator
id="RequiredFieldValidator3"
runat="server"
ControlToValidate="ddType"
Display="Static"
ErrorMessage="*Required" CssClass="RequiredField" />
</InsertItemTemplate>
</asp:TemplateField>
好的……那么我需要处理FormView.itemsinserting
并手动添加参数?在Edit
模式下,相同的问题会怎样?手动处理初始值和更新值?希望为后代提供示例代码。我验证了此解决方案的有效性。谢谢我有一些类似的想法,但不确定大多数人是如何处理这个问题的。我使用这种方法已经很多年了,自从我开始使用这种方法以来,我从互联网上搜索了很多,除了我提供给你的解决方案之外,我找不到其他解决方案。你能提供完整的页面来源吗?这个问题只有在模板中有级联控件时才会出现,我的理解是DataBinder.Eval本质上和Eval是一样的。@pseudocoder我认为它们做的是一样的。然而,最近我发现它们在级联下拉列表中略有不同。我已经附上了我的代码,它工作得很好。
<asp:Content ID="Content3" ContentPlaceHolderID="BodyContent" runat="Server">
<asp:DetailsView ID="dv" runat="server" Height="50px" DataSourceID="ODS" DefaultMode="Insert"
AutoGenerateRows="False" OnItemCommand="dv_ItemCommand" OnItemInserted="dv_ItemInserted"
DataKeyNames="Id" OnItemUpdated="dv_ItemUpdated" CssClass="DetailsView"
>
<Fields>
<asp:TemplateField HeaderText="Page Name:">
<ItemTemplate>
<asp:Label ID="txtPageName" runat="server" Text="<%#Bind('PageName') %>" />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtPageName" runat="server" Text="<%#Bind('PageName') %>" />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Parent:">
<ItemTemplate>
<asp:Label ID="txtParentPageName" runat="server" Text='<%#Bind("ParentPageName") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList runat="server" ID="lstParentPage" DataSourceID="ParentPageODS"
AppendDataBoundItems="true" DataTextField="PageName" DataValueField="Id" SelectedValue="<%#Bind('ParentPage') %>"
AutoPostBack="True">
<asp:ListItem Text="-Root-" Value="" />
</asp:DropDownList>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="After...">
<ItemTemplate>
<asp:Label ID="txtPreviousPage" runat="server" Text='<%#Bind("PageOrder") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList runat="server" ID="lstPageOrder" AppendDataBoundItems="true" DataTextField="PageName" DataSourceID="PageOrderODS" DataValueField="PageOrder" EnableViewState="False" SelectedValue='<%# DataBinder.Eval (Container.DataItem, "PageOrder") %>'>
<asp:ListItem Text="-First-" Value="" />
</asp:DropDownList>
<asp:ObjectDataSource ID="PageOrderODS" runat="server" SelectMethod="SelectByParent"
TypeName="SirM2X.Pages">
<SelectParameters>
<asp:ControlParameter ControlID="lstParentPage" Name="ParentPage" PropertyName="SelectedValue" />
</SelectParameters>
</asp:ObjectDataSource>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Dummy Page?">
<ItemTemplate>
<asp:Label runat="server" ID="txtDummyPage" Text="<%#Bind('IsDummyText') %>" />
</ItemTemplate>
<EditItemTemplate>
<asp:CheckBox ID="chkIsDummy" runat="server" Checked="<%#Bind('IsDummy') %>" />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField ShowHeader="False">
<EditItemTemplate>
<asp:Button ID="btnUpdate" runat="server" CausesValidation="True" CommandName="Update"
Text="<%$Resources:Resources, Update %>" />
<asp:Button ID="btnCancel" runat="server" CausesValidation="False" CommandName="Cancel"
Text="<%$Resources:Resources, Cancel %>" />
</EditItemTemplate>
<InsertItemTemplate>
<asp:Button ID="btnInsert" runat="server" CausesValidation="True" CommandName="Insert"
Text="<%$Resources:Resources, Insert %>" />
<asp:Button ID="btnCancel" runat="server" CausesValidation="False" CommandName="Cancel"
Text="<%$Resources:Resources, Cancel %>" />
</InsertItemTemplate>
<ItemTemplate>
<asp:Button ID="btnEdit" runat="server" CausesValidation="False" CommandName="Edit"
Text="<%$Resources:Resources, Edit %>" />
</ItemTemplate>
</asp:TemplateField>
</Fields>
</asp:DetailsView>
<asp:ObjectDataSource ID="ODS" runat="server" DeleteMethod="DeleteRow" InsertMethod="InsertRow"
SelectMethod="SelectRow" TypeName="SirM2X.Pages" UpdateMethod="UpdateRow" OnInserting="ODS_Inserting"
OnUpdating="ODS_Updating">
<DeleteParameters>
<asp:Parameter Name="Id" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="PageName" Type="String" />
<asp:Parameter Name="CreatedBy" Type="String" />
<asp:Parameter Name="ParentPage" Type="Int32" />
<asp:Parameter Name="PageOrder" Type="Int32" />
<asp:Parameter Name="IsDummy" Type="Boolean" />
</InsertParameters>
<SelectParameters>
<asp:QueryStringParameter Name="Id" QueryStringField="ID" Type="Int32" />
</SelectParameters>
<UpdateParameters>
<asp:Parameter Name="Id" Type="Int32" />
<asp:Parameter Name="PageName" Type="String" />
<asp:Parameter Name="ParentPage" Type="Int32" />
<asp:Parameter Name="PageOrder" Type="Int32" />
<asp:Parameter Name="IsDummy" Type="Boolean" />
<asp:Parameter Name="DeleteState" Type="Boolean" />
</UpdateParameters>
</asp:ObjectDataSource>
<asp:ObjectDataSource ID="ParentPageODS" runat="server" SelectMethod="SelectAll"
TypeName="SirM2X.Pages"></asp:ObjectDataSource>
<asp:SqlDataSource ID="sqldsDDPlant" runat="server" ConnectionString="<%$ ConnectionStrings:SeedTrackerConnectionString %>"
SelectCommand="SELECT * FROM [Plant] ORDER BY [Plant]"></asp:SqlDataSource>
<asp:SqlDataSource ID="sqldsDDType" runat="server" ConnectionString="<%$ ConnectionStrings:SeedTrackerConnectionString %>"
SelectCommand="SELECT * FROM [Type] ORDER BY [Type]" FilterExpression="PLID = '{0}'">
<FilterParameters>
<asp:ControlParameter Name="plantParam" ControlID="DVSeedTracker$ddPlant" PropertyName="SelectedValue" />
</FilterParameters>
</asp:SqlDataSource>
<asp:TemplateField HeaderText="Plant">
<InsertItemTemplate>
<asp:DropDownList ID="ddPlant" runat="server" AutoPostBack="true" SelectedValue='<%# Bind("PLID") %>'
DataSourceID="sqldsDDPlant" DataTextField="Plant" DataValueField="PLID" AppendDataBoundItems="True">
<asp:ListItem></asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator
id="RequiredFieldValidator2"
runat="server"
ControlToValidate="ddPlant"
Display="Static"
ErrorMessage="*Required" CssClass="RequiredField" />
</InsertItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Type">
<InsertItemTemplate>
<asp:DropDownList ID="ddType" runat="server"
DataSourceID="sqldsDDType" DataTextField="Type" DataValueField="TYPID" AppendDataBoundItems="False">
<asp:ListItem></asp:ListItem>
</asp:DropDownList>
<asp:RequiredFieldValidator
id="RequiredFieldValidator3"
runat="server"
ControlToValidate="ddType"
Display="Static"
ErrorMessage="*Required" CssClass="RequiredField" />
</InsertItemTemplate>
</asp:TemplateField>