如何保持DropDownList AutoPostBack=true且不触发ObjectDataSource的Select方法
解决方案
我来帮你搞定这个问题!你需要保留DropDownList的AutoPostBack=true(毕竟这个对其他功能很重要),但不想每次切换选项就自动触发ObjectDataSource的SelectMethod,而是用搜索按钮来控制数据过滤的时机,对吧?这里有两种实用的方案,你可以按需选择:
方案一:通过拦截Select操作控制触发时机
这个方法的核心是给ObjectDataSource加一个拦截事件,只有点击搜索按钮时才允许它执行查询,其他回发(比如DropDownList切换)都阻止查询。
1. 修改ObjectDataSource的ASPX代码
给它加上OnSelecting事件,用来拦截查询操作:
<asp:ObjectDataSource ID="ObjectDataSourceTest" runat="server" SelectMethod="GetTestData" TypeName="DataManager" OnSelecting="ObjectDataSourceTest_Selecting"> <SelectParameters> <asp:Parameter Name="sortExpression" Type="String" /> <asp:ControlParameter ControlID="DropDownListXY" Name="xyFilter" Type="String" /> </SelectParameters> </asp:ObjectDataSource>
2. 添加搜索按钮
在DropDownList所在的Panel里加一个搜索按钮,用来触发数据查询:
<div class="grid-100"> <asp:DropDownList ID="DropDownListXY" OnSelectedIndexChanged="DropDownListXY_SelectedIndexChanged" DataSourceID="ObjectDataSourceApplikationTyp" runat="server" DataValueField="test_guid" DataTextField="test" AppendDataBoundItems="true" AutoPostBack="true"> <asp:ListItem Text="-- all --" Value=""></asp:ListItem> </asp:DropDownList> <!-- 新增搜索按钮 --> <asp:Button ID="btnSearch" runat="server" Text="搜索" OnClick="btnSearch_Click" /> </div>
3. 后台代码添加逻辑
在后台(比如.aspx.cs文件)里定义一个标记变量,用来控制是否允许查询,然后分别处理三个事件:
// 标记是否允许ObjectDataSource执行查询 private bool AllowSelect = false; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 页面首次加载时允许查询,展示初始数据 AllowSelect = true; } } protected void DropDownListXY_SelectedIndexChanged(object sender, EventArgs e) { // DropDownList切换时,禁止自动查询 AllowSelect = false; } protected void btnSearch_Click(object sender, EventArgs e) { // 点击搜索按钮时,允许查询并手动触发数据绑定 AllowSelect = true; // 替换成你的GridView的ID GridView1.DataBind(); } protected void ObjectDataSourceTest_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) { // 如果不允许查询,就取消这次操作 if (!AllowSelect) { e.Cancel = true; } }
方案二:手动传递参数,取消自动绑定
这个方法更直接,把ObjectDataSource里的自动参数绑定改成手动设置,只有点击搜索按钮时才把DropDownList的选中值传给查询方法。
1. 修改ObjectDataSource的ASPX代码
把ControlParameter改成普通的Parameter,去掉自动绑定:
<asp:ObjectDataSource ID="ObjectDataSourceTest" runat="server" SelectMethod="GetTestData" TypeName="DataManager"> <SelectParameters> <asp:Parameter Name="sortExpression" Type="String" /> <asp:Parameter Name="xyFilter" Type="String" DefaultValue="" /> </SelectParameters> </asp:ObjectDataSource>
2. 后台处理搜索按钮点击事件
在搜索按钮的点击事件里,手动把DropDownList的选中值传给ObjectDataSource的参数,然后触发数据绑定:
protected void btnSearch_Click(object sender, EventArgs e) { // 手动设置查询参数的值 ObjectDataSourceTest.SelectParameters["xyFilter"].DefaultValue = DropDownListXY.SelectedValue; // 触发GridView绑定,执行查询 GridView1.DataBind(); }
这种方法下,DropDownList的AutoPostBack=true只会触发页面回发,但不会自动触发查询,因为参数不再自动绑定了,完全由搜索按钮控制时机。
注意点
- 确保你的GridView的
DataSourceID还是指向ObjectDataSourceTest,这样手动调用DataBind()时才能触发查询。 - 如果页面还有其他回发操作,要注意不要影响
AllowSelect变量的状态(方案一需要注意),或者根据需求调整它的值。
内容的提问来源于stack exchange,提问作者Alessandro Minneci
相关产品推荐
相关产品推荐

