使用Repeater生成多GridView时,如何为每个配置ObjectDataSource并添加SelectParameter?
问题解决方案
1. ObjectDataSource的放置位置
必须把ObjectDataSource放在Repeater的ItemTemplate内部,每个GridView对应独立的数据源实例:
- ASP.NET会自动为Repeater内部的控件生成唯一的客户端ID,服务器端通过
NamingContainer区分不同Item里的控件,不会出现ID重复冲突的问题。 - 放在外部作为静态控件会导致所有GridView共用同一个数据源实例,回发时参数混乱,分页逻辑必然失效。
2. 在ItemDataBound中设置参数
在Repeater的ItemDataBound事件里,针对当前Item内的独立数据源实例添加/修改参数,代码示例如下:
.ascx模板代码
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound"> <ItemTemplate> <asp:GridView ID="GridView1" runat="server" DataSourceID="DynamicDocumentsDataSource" AllowPaging="True" PageSize="10"> <!-- 自定义GridView列 --> </asp:GridView> <asp:ObjectDataSource ID="DynamicDocumentsDataSource" runat="server" TypeName="ConnectIT.Bll.Search" SelectMethod="GetPagedDataSet" EnablePaging="true" SelectCountMethod="GetRowCount" StartRowIndexParameterName="startRow" MaximumRowsParameterName="pageSize" SortParameterName="sortColumns" OnObjectCreated="dynamicDocuments_ObjectCreated"> <SelectParameters> <asp:Parameter Name="storedProc" DefaultValue="[uspGetDynamicDocuments]" /> </SelectParameters> </asp:ObjectDataSource> </ItemTemplate> </asp:Repeater>
后台代码
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e) { // 只处理数据项(忽略Header/Footer) if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return; // 获取当前Repeater项绑定的数据模型(根据你的业务场景替换为实际类型) var currentItemData = (YourCustomDataModel)e.Item.DataItem; // 找到当前Item内的ObjectDataSource var ods = (ObjectDataSource)e.Item.FindControl("DynamicDocumentsDataSource"); // 示例1:修改已存在的storedProc参数值 ods.SelectParameters["storedProc"].DefaultValue = currentItemData.TargetStoredProc; // 示例2:添加新的查询参数(比如分类ID) var categoryParam = ods.SelectParameters["CategoryId"]; if (categoryParam == null) { categoryParam = new Parameter("CategoryId", TypeCode.Int32); ods.SelectParameters.Add(categoryParam); } categoryParam.DefaultValue = currentItemData.CategoryId.ToString(); }
3. 参数处理注意事项
- 每个Repeater Item内的
ObjectDataSource是独立实例,参数只作用于当前Item的GridView,不需要手动清除其他实例的参数,彼此互不干扰。 - 不要直接覆盖整个
SelectParameters集合,针对单个参数修改值即可,避免破坏分页相关的默认参数配置。
4. 解决分页失效问题
分页失效的核心原因是回发时Repeater数据源丢失,导致ItemDataBound无法重新设置参数。需要在Page_Load中确保回发时Repeater能重新绑定数据源:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 首次加载:获取Repeater的数据源(比如多个分类/模块的列表) var repeaterDataSource = GetRepeaterSourceData(); Repeater1.DataSource = repeaterDataSource; Repeater1.DataBind(); // 将数据源存入ViewState,供回发时使用 ViewState["RepeaterData"] = repeaterDataSource; } else { // 回发时:从ViewState恢复数据源并重新绑定 var repeaterDataSource = (List<YourCustomDataModel>)ViewState["RepeaterData"]; Repeater1.DataSource = repeaterDataSource; Repeater1.DataBind(); } }
内容的提问来源于stack exchange,提问作者DaveyBoy
相关产品推荐
相关产品推荐

