我想鏈接一些綁定到LinqDataSource的ASP.NET gridview控件下拉列表。當我點擊'編輯'命令字段時,下拉框會按照它們應該顯示的內容顯示。當用戶更改第一個下拉菜單時,我想根據第一個下拉菜單的選擇重新填充第二個下拉菜單。這是我的GridView: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>
正如你可以在第二列(司),我現在用的是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那存在於它下面。爲什麼我會收到此消息,以及有關如何正確執行此操作的任何建議?
爲什麼你必須到現場的SelectedValue綁定您cboBusinessUnit下拉列表?如果你把它拿出來怎麼辦? –
用戶需要能夠保存記錄的BusinessUnitID。如果我刪除了SelectedValue,那麼他們將無法更新業務單位(並且它不會爲記錄顯示正確的業務單位)。 – Hoff
它確實擺脫了錯誤,雖然當我刪除...所以,也許我必須在代碼隱藏後手動設置BusinessUnitID ... – Hoff