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

使用Repeater生成多GridView时,如何给事件传递自定义参数

在Repeater生成的多GridView事件中传递专属参数的解决方案

方法1:用GridView的ViewState存储专属Dictionary

先在Repeater的ItemDataBound事件里,给每个GridView绑定专属字典:

  1. 确保Repeater的数据源里包含每个GridView对应的专属字典(比如自定义一个类,同时存GridView要绑的数据和专属字典)。
  2. 在Repeater的ItemDataBound中找到GridView,把字典存入它的ViewState:
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType is ListItemType.Item or ListItemType.AlternatingItem)
    {
        // 假设Repeater的数据源项是自定义类YourCustomItem
        var dataItem = (YourCustomItem)e.Item.DataItem;
        GridView gv = (GridView)e.Item.FindControl("GridView1");
        
        // 把专属字典存到GridView的ViewState里
        gv.ViewState["ExclusiveDict"] = dataItem.ExclusiveDictionary;
        
        // 绑定GridView数据
        gv.DataSource = dataItem.GridViewData;
        gv.DataBind();
    }
}
  1. 之后在GridView的RowDataBound里取出字典使用:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        GridView gv = (GridView)sender;
        var exclusiveDict = (Dictionary<object, object>)gv.ViewState["ExclusiveDict"];
        
        // 这里直接操作专属字典即可
        // 示例:var targetValue = exclusiveDict[e.Row.DataItem];
    }
}

如果用Attributes存储的话,因为只能存字符串,需要把字典序列化(比如JSON),不如ViewState方便。

方法2:动态绑定事件时用闭包捕获参数(推荐)

不在前台标记里写OnRowDataBound,而是在后台动态绑定事件,通过闭包直接捕获专属字典:

  1. 前台Repeater里的GridView去掉OnRowDataBound属性:
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
    <ItemTemplate>
        <asp:GridView ID="GridView1" runat="server">
            <!-- 列定义 -->
        </asp:GridView>
    </ItemTemplate>
</asp:Repeater>
  1. 在Repeater的ItemDataBound中动态绑定RowDataBound事件:
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType is ListItemType.Item or ListItemType.AlternatingItem)
    {
        var dataItem = (YourCustomItem)e.Item.DataItem;
        GridView gv = (GridView)e.Item.FindControl("GridView1");
        
        // 用lambda表达式绑定事件,闭包直接捕获专属字典
        gv.RowDataBound += (s, args) =>
        {
            if (args.Row.RowType == DataControlRowType.DataRow)
            {
                // 直接使用捕获的专属字典
                var value = dataItem.ExclusiveDictionary[args.Row.DataItem];
                // 执行你的业务操作
            }
        };
        
        gv.DataSource = dataItem.GridViewData;
        gv.DataBind();
    }
}

这个方法不用依赖ViewState或其他存储,逻辑直接,代码更简洁。

方法3:用GridView的Tag属性存专属字典

Tag属性可以存储任意对象,适合单次绑定的场景:

  1. 在Repeater的ItemDataBound里把字典存入GridView的Tag:
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType is ListItemType.Item or ListItemType.AlternatingItem)
    {
        var dataItem = (YourCustomItem)e.Item.DataItem;
        GridView gv = (GridView)e.Item.FindControl("GridView1");
        
        gv.Tag = dataItem.ExclusiveDictionary;
        gv.DataSource = dataItem.GridViewData;
        gv.DataBind();
    }
}
  1. 在RowDataBound里取出使用:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        GridView gv = (GridView)sender;
        var exclusiveDict = (Dictionary<object, object>)gv.Tag;
        // 操作字典
    }
}

内容的提问来源于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 08:38:16