You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:02:04