【发布时间】:2014-03-14 00:21:17
【问题描述】:
我试图在绑定到 LinqDataSource 的 ASP.NET gridview 控件中链接一些下拉列表。当我单击“编辑”命令字段时,下拉菜单会按预期显示。当用户更改第一个下拉列表时,我希望第二个根据第一个的选择重新填充。这是我的网格视图:
<asp:GridView ID="gvAreas" runat="server" AllowSorting="True" AutoGenerateColumns="False" CssClass="grid pad5 full" DataKeyNames="ID" DataSourceID="ldsAreas">
<Columns>
<asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" Visible="false" />
<asp:TemplateField HeaderText="Division" SortExpression="CDB_BusinessUnit.CDB_Division.Name">
<ItemTemplate>
<%#Eval("CDB_BusinessUnit.CDB_Division.Name") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="cboDivision" runat="server" AppendDataBoundItems="True" DataSourceID="ldsDivisions" DataTextField="Name" DataValueField="ID" SelectedValue='<%#Eval("CDB_BusinessUnit.DivisionID") %>' AutoPostBack="True" OnSelectedIndexChanged="cboDivision_SelectedIndexChanged">
<asp:ListItem Text="" Value="" />
</asp:DropDownList>
<asp:LinqDataSource ID="ldsDivisions" runat="server" ContextTypeName="CommonDB_Management.CommonDBDataContext" EntityTypeName="" Select="new (ID, Name)" TableName="CDB_Divisions" OrderBy="Name" />
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Business Unit" SortExpression="CDB_BusinessUnit.Name">
<ItemTemplate>
<%#Eval("CDB_BusinessUnit.Name") %>
</ItemTemplate>
<EditItemTemplate>
<asp:DropDownList ID="cboBusinessUnit" runat="server" AppendDataBoundItems="true" DataSourceID="ldsBusinessUnits" DataTextField="Name" DataValueField="ID" SelectedValue='<%#Bind("BusinessUnitID") %>' />
<asp:LinqDataSource ID="ldsBusinessUnits" runat="server" ContextTypeName="CommonDB_Management.CommonDBDataContext" EntityTypeName="" TableName="CDB_BusinessUnits" Where="DivisionID == @DivisionID" >
<WhereParameters>
<asp:ControlParameter ControlID="cboDivision" Name="DivisionID" PropertyName="SelectedValue" Type="Int32" />
</WhereParameters>
</asp:LinqDataSource>
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="true" HeaderStyle-Width="100px" HeaderStyle-CssClass="center" ItemStyle-CssClass="center" HeaderText="Edit" ValidationGroup="gv" />
<asp:CommandField ShowDeleteButton="true" HeaderStyle-Width="100px" HeaderStyle-CssClass="center" ItemStyle-CssClass="center" HeaderText="Delete" />
</Columns>
</asp:GridView>
<asp:LinqDataSource ID="ldsAreas" runat="server" ContextTypeName="CommonDB_Management.CommonDBDataContext" EnableDelete="True" EnableInsert="True" EnableUpdate="True" EntityTypeName="" TableName="CDB_Areas" OrderBy="CDB_BusinessUnit.CDB_Division.Name, CDB_BusinessUnit.Name, Name"></asp:LinqDataSource>
正如您在第二列(Division)中看到的,我正在使用OnSelectedIndexChanged 事件尝试重新绑定第二个下拉列表。这是事件中的代码:
protected void cboDivision_SelectedIndexChanged(object sender, EventArgs e)
{
DropDownList cboBusinessUnit = gvAreas.Rows[gvAreas.EditIndex].FindControl("cboBusinessUnit") as DropDownList;
cboBusinessUnit.DataBind();
}
我的问题是,上面的代码在DataBind() 调用时出现消息:
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
控件cboBusinessUnit 显然绑定到它正下方的LinqDataSource。为什么我会收到此消息,以及有关执行此操作的正确方法的任何建议?
【问题讨论】:
-
为什么必须为您的 cboBusinessUnit 下拉列表绑定 SelectedValue 字段?如果你把它拿出来怎么办?
-
用户需要能够保存BusinessUnitID作为记录。如果我删除 SelectedValue,那么他们将无法更新业务单位(并且它不会显示正确的业务单位以供记录)。
-
它确实摆脱了错误,但当我删除它时......所以也许我必须在代码隐藏中手动设置 BusinessUnitID......
-
嗯..需要再考虑一下....
-
你可以试试这个。添加回 SelectedValue 属性,但这次使用