“数据绑定方法,如Eval(),XPath()和Bind()只能在数据绑定控件的上下文中使用。”(“Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.”)
我在GridView中有5个DropDownLists。 我使用ObjectDataSource绑定网格,并使用5个ObjectDataSources绑定属于GridView的DropDownLists。 一切都很好。 我在C#中捕获了第一个DropDownList SelectedIndexChanged事件,我想绑定第二个DropDownList。 这是我用来绑定第二个下拉列表的代码:
protected void Level1DropdownList_SelectedIndexChanged(object sender, EventArgs e) { DropDownList level1List = sender as DropDownList; if (level1List != null) { if (level1List.SelectedValue != "0") { // Bind Level 2 List GridViewRow currentRow = AnnouncementLevelsGrid.Rows[AnnouncementLevelsGrid.EditIndex]; if (currentRow != null) { DropDownList level2List = currentRow.FindControl("Level2DropdownList") as DropDownList; if (level2List != null) { level2List.DataSource = AnnouncementHelper.GetLevel2(level1List.SelectedValue, EmployerHelper.EmployerID); level2List.DataTextField = "Level2"; level2List.DataValueField = "Level2Value"; level2List.DataBind(); } } } } }
这是asp.net代码示例。
<asp:GridView ID="AnnouncementLevelsGrid" runat="server" Width="99%" DataSourceID="AnnouncementLevelsDataSource" CssClass="Grid" AutoGenerateColumns="False" GridLines="None" DataKeyNames="AnnouncementLevelID,AnnouncementId" ViewStateMode="Enabled" OnRowCommand="AnnouncementLevelsGrid_RowCommand" OnRowDataBound="AnnouncementLevelsGrid_RowDataBound" OnRowUpdating="AnnouncementLevelsGrid_RowUpdating"> <HeaderStyle CssClass="GridHeader" /> <RowStyle CssClass="GridRow" /> <AlternatingRowStyle CssClass="GridAlternating" /> <Columns> <asp:TemplateField HeaderText="Level 1"> <ItemTemplate> <asp:Label ID="Level1Label" runat="server" Text='<%# Eval("Level1").ToString() == "0" ? "ALL" : Eval("Level1") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level1DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level1" DataValueField="Level1Value" SelectedValue='<%# Eval("Level1") %>' AutoPostBack="True" DataSourceID="Level1DataSource" OnSelectedIndexChanged="Level1DropdownList_SelectedIndexChanged"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField HeaderText="Level 2"> <ItemTemplate> <asp:Label ID="Level2Label" runat="server" Text='<%# Eval("Level2").ToString() == "0" ? "ALL" : Eval("Level2") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level2DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level2" DataValueField="Level2Value" SelectedValue='<%# Eval("Level2") %>' AutoPostBack="True" DataSourceID="Level2DataSource" OnSelectedIndexChanged="Level2DropdownList_SelectedIndexChanged"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField HeaderText="Level 3"> <ItemTemplate> <asp:Label ID="Level3Label" runat="server" Text='<%# Eval("Level3").ToString() == "0" ? "ALL" : Eval("Level3") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level3DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level3" DataValueField="Level3Value" SelectedValue='<%# Eval("Level3") %>' AutoPostBack="True" DataSourceID="Level3DataSource" OnSelectedIndexChanged="Level3DropdownList_SelectedIndexChanged"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField HeaderText="Level 4"> <ItemTemplate> <asp:Label ID="Level4Label" runat="server" Text='<%# Eval("Level4").ToString() == "0" ? "ALL" : Eval("Level4") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level4DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level4" DataValueField="Level4Value" SelectedValue='<%# Eval("Level4") %>' AutoPostBack="True" DataSourceID="Level4DataSource" OnSelectedIndexChanged="Level4DropdownList_SelectedIndexChanged"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField HeaderText="Level 5"> <ItemTemplate> <asp:Label ID="Level5Label" runat="server" Text='<%# Eval("Level5").ToString() == "0" ? "ALL" : Eval("Level5") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level5DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level5" DataValueField="Level5Value" SelectedValue='<%# Eval("Level5") %>' DataSourceID="Level5DataSource"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="EditLink" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit" ToolTip="Edit"><img src="images/edit.png" alt="Edit" style="border-width: 0px;" /></asp:LinkButton> </ItemTemplate> <EditItemTemplate> <asp:LinkButton ID="UpdateLink" runat="server" CausesValidation="True" CommandName="Update" Text="Update" ToolTip="Update"><img src="images/Update-Grd.png" alt="Update" style="border-width: 0px;" /></asp:LinkButton> <asp:LinkButton ID="CancelLink" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" ToolTip="Cancel"><img src="images/Cancel-Grd.png" alt="Cancel" style="border-width: 0px;" /></asp:LinkButton> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="10%" /> <ItemStyle HorizontalAlign="Center" Width="10%" /> </asp:TemplateField> </Columns> <EmptyDataTemplate> No Announcements Found. </EmptyDataTemplate> </asp:GridView> <asp:ObjectDataSource ID="AnnouncementLevelsDataSource" runat="server" SelectMethod="GetAnnouncementLevels" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="AnnouncementLevelsDataSource_Selecting"> <SelectParameters> <asp:Parameter Name="announcementID" DbType="Int64" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level1DataSource" runat="server" SelectMethod="GetLevel1" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level1DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level2DataSource" runat="server" SelectMethod="GetLevel2" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level2DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> <asp:Parameter Name="cc1" DbType="String" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level3DataSource" runat="server" SelectMethod="GetLevel3" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level3DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> <asp:Parameter Name="cc2" DbType="String" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level4DataSource" runat="server" SelectMethod="GetLevel4" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level4DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> <asp:Parameter Name="cc3" DbType="String" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level5DataSource" runat="server" SelectMethod="GetLevel5" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level5DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> <asp:Parameter Name="cc4" DbType="String" /> </SelectParameters> </asp:ObjectDataSource>
当我在网格视图中单击编辑按钮时,所有下拉列表都会以编辑模式呈现它们。 他们也正确地填充数据。 现在当我更改第一个下拉列表项以填充第二个下拉列表项时,它会抛出以下异常:
数据绑定方法(如Eval(),XPath()和Bind())只能在数据绑定控件的上下文中使用。
任何人都可以告诉我如何摆脱这个问题。 我是否需要处理另一个网格事件才能正确绑定下拉列表? 此外,我希望绑定下拉列表后网格行仍处于编辑模式。
I have 5 DropDownLists in GridView. I bind the grid with ObjectDataSource and also bind the DropDownLists that belongs to GridView with 5 ObjectDataSources. Every thing is working fine. I capture first DropDownList SelectedIndexChanged event in C# and i want to bind 2nd DropDownList. Here is the code that i am using to bind second dropdownlist:
protected void Level1DropdownList_SelectedIndexChanged(object sender, EventArgs e) { DropDownList level1List = sender as DropDownList; if (level1List != null) { if (level1List.SelectedValue != "0") { // Bind Level 2 List GridViewRow currentRow = AnnouncementLevelsGrid.Rows[AnnouncementLevelsGrid.EditIndex]; if (currentRow != null) { DropDownList level2List = currentRow.FindControl("Level2DropdownList") as DropDownList; if (level2List != null) { level2List.DataSource = AnnouncementHelper.GetLevel2(level1List.SelectedValue, EmployerHelper.EmployerID); level2List.DataTextField = "Level2"; level2List.DataValueField = "Level2Value"; level2List.DataBind(); } } } } }
Here is the asp.net code sample.
<asp:GridView ID="AnnouncementLevelsGrid" runat="server" Width="99%" DataSourceID="AnnouncementLevelsDataSource" CssClass="Grid" AutoGenerateColumns="False" GridLines="None" DataKeyNames="AnnouncementLevelID,AnnouncementId" ViewStateMode="Enabled" OnRowCommand="AnnouncementLevelsGrid_RowCommand" OnRowDataBound="AnnouncementLevelsGrid_RowDataBound" OnRowUpdating="AnnouncementLevelsGrid_RowUpdating"> <HeaderStyle CssClass="GridHeader" /> <RowStyle CssClass="GridRow" /> <AlternatingRowStyle CssClass="GridAlternating" /> <Columns> <asp:TemplateField HeaderText="Level 1"> <ItemTemplate> <asp:Label ID="Level1Label" runat="server" Text='<%# Eval("Level1").ToString() == "0" ? "ALL" : Eval("Level1") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level1DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level1" DataValueField="Level1Value" SelectedValue='<%# Eval("Level1") %>' AutoPostBack="True" DataSourceID="Level1DataSource" OnSelectedIndexChanged="Level1DropdownList_SelectedIndexChanged"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField HeaderText="Level 2"> <ItemTemplate> <asp:Label ID="Level2Label" runat="server" Text='<%# Eval("Level2").ToString() == "0" ? "ALL" : Eval("Level2") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level2DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level2" DataValueField="Level2Value" SelectedValue='<%# Eval("Level2") %>' AutoPostBack="True" DataSourceID="Level2DataSource" OnSelectedIndexChanged="Level2DropdownList_SelectedIndexChanged"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField HeaderText="Level 3"> <ItemTemplate> <asp:Label ID="Level3Label" runat="server" Text='<%# Eval("Level3").ToString() == "0" ? "ALL" : Eval("Level3") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level3DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level3" DataValueField="Level3Value" SelectedValue='<%# Eval("Level3") %>' AutoPostBack="True" DataSourceID="Level3DataSource" OnSelectedIndexChanged="Level3DropdownList_SelectedIndexChanged"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField HeaderText="Level 4"> <ItemTemplate> <asp:Label ID="Level4Label" runat="server" Text='<%# Eval("Level4").ToString() == "0" ? "ALL" : Eval("Level4") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level4DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level4" DataValueField="Level4Value" SelectedValue='<%# Eval("Level4") %>' AutoPostBack="True" DataSourceID="Level4DataSource" OnSelectedIndexChanged="Level4DropdownList_SelectedIndexChanged"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField HeaderText="Level 5"> <ItemTemplate> <asp:Label ID="Level5Label" runat="server" Text='<%# Eval("Level5").ToString() == "0" ? "ALL" : Eval("Level5") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:DropDownList ID="Level5DropdownList" runat="server" AppendDataBoundItems="True" DataTextField="Level5" DataValueField="Level5Value" SelectedValue='<%# Eval("Level5") %>' DataSourceID="Level5DataSource"> <asp:ListItem Text="All" Value="0"></asp:ListItem> </asp:DropDownList> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="18%" /> <ItemStyle HorizontalAlign="Center" Width="18%" /> </asp:TemplateField> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="EditLink" runat="server" CausesValidation="False" CommandName="Edit" Text="Edit" ToolTip="Edit"><img src="images/edit.png" alt="Edit" style="border-width: 0px;" /></asp:LinkButton> </ItemTemplate> <EditItemTemplate> <asp:LinkButton ID="UpdateLink" runat="server" CausesValidation="True" CommandName="Update" Text="Update" ToolTip="Update"><img src="images/Update-Grd.png" alt="Update" style="border-width: 0px;" /></asp:LinkButton> <asp:LinkButton ID="CancelLink" runat="server" CausesValidation="False" CommandName="Cancel" Text="Cancel" ToolTip="Cancel"><img src="images/Cancel-Grd.png" alt="Cancel" style="border-width: 0px;" /></asp:LinkButton> </EditItemTemplate> <HeaderStyle HorizontalAlign="Center" Width="10%" /> <ItemStyle HorizontalAlign="Center" Width="10%" /> </asp:TemplateField> </Columns> <EmptyDataTemplate> No Announcements Found. </EmptyDataTemplate> </asp:GridView> <asp:ObjectDataSource ID="AnnouncementLevelsDataSource" runat="server" SelectMethod="GetAnnouncementLevels" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="AnnouncementLevelsDataSource_Selecting"> <SelectParameters> <asp:Parameter Name="announcementID" DbType="Int64" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level1DataSource" runat="server" SelectMethod="GetLevel1" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level1DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level2DataSource" runat="server" SelectMethod="GetLevel2" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level2DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> <asp:Parameter Name="cc1" DbType="String" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level3DataSource" runat="server" SelectMethod="GetLevel3" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level3DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> <asp:Parameter Name="cc2" DbType="String" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level4DataSource" runat="server" SelectMethod="GetLevel4" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level4DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> <asp:Parameter Name="cc3" DbType="String" /> </SelectParameters> </asp:ObjectDataSource> <asp:ObjectDataSource ID="Level5DataSource" runat="server" SelectMethod="GetLevel5" TypeName="LinkManagement.DataAccess.AnnouncementHelper" OnSelecting="Level5DataSource_Selecting"> <SelectParameters> <asp:Parameter Name="employerID" DbType="Int64" /> <asp:Parameter Name="cc4" DbType="String" /> </SelectParameters> </asp:ObjectDataSource>
When i click edit button in grid view, all the dropdownlists render them in edit mode. They are also populating data correctly. Now when i change the first drop down list item in order to populate the second one, it throws the following exception :
Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.
Can any body tell me how can i get rid of this problem. Do i need to handle another event of grid to bind the dropdown correctly? Also i want grid row still in edit mode after binding dropdown.
原文:https://stackoverflow.com/questions/14021874
最满意答案
您的messageOk方法需要返回一个页面,其中包含一个表单,该表单包含已传递的每个字段的隐藏字段+一个Ok按钮。 所以类似于:
<form method="POST or GET" action="origin url"> <input type="hidden" name="param1" value="value for param1"/> ... for each input ... <input type="hidden" name="paramN" value="value for paramN"/> <input type=submit" value="Continue"/> </form>
只要您没有正在上传文件的POST,这应该可以正常工作。 您可能希望在应用程序中考虑更简单的流程,例如仅在有人登录时强制执行此页面。
Your messageOk method will need to return a page with a form that has hidden fields for each field they passed + an Ok button. So something like:
<form method="POST or GET" action="origin url"> <input type="hidden" name="param1" value="value for param1"/> ... for each input ... <input type="hidden" name="paramN" value="value for paramN"/> <input type=submit" value="Continue"/> </form>
This should work as long as you don't have a POST that is uploading a file. You might want to consider a simpler flow in your application, like forcing this page only when somebody logs in.
相关问答
更多-
request.getRequestDispatcher.forward()是异步的吗?(is request.getRequestDispatcher.forward() asynchronous?)[2021-11-10]
不,它并不意味着它是异步的。 它只是意味着forward是一种常规的Java方法,并且没有理由让其余的代码不能执行。 请求被转发后,您有责任避免修改响应。 但为什么下面的代码不会将所有内容都记录到标准输出中? System.out.println("About to forward the request to " + jspFileName + "..."); long t0 = System.currentTimeMillis(); request.getRequestDispatcher(jspFil ... -
如果您处于控制器操作中,请退出操作方法并返回new HttpStatusCodeResult(302) 。 If you are in a controller action, exit the action method with returning a new HttpStatusCodeResult(302).
-
由于安全原因 , com.ibm.ws.webcontainer.disallowServeServletsByClassname属性的默认设置已更改。 请注意:此APAR已将WebContainer自定义属性com.ibm.ws.webcontainer.disallowServeServletsByClassname的默认值从false更改为true,以便不会发生安全威胁。 在此更改之前,开发人员需要记住在部署到生产环境之前将自定义属性更改为true。 属性名称:com.ibm.ws.webcontai ...
-
重定向getRequestDispatcher后重做原始请求(redo the original request after redirection getRequestDispatcher)[2023-06-17]
您的messageOk方法需要返回一个页面,其中包含一个表单,该表单包含已传递的每个字段的隐藏字段+一个Ok按钮。 所以类似于: