使用Repeater生成多GridView时,如何给事件传递自定义参数
在Repeater生成的多GridView事件中传递专属参数的解决方案
方法1:用GridView的ViewState存储专属Dictionary
先在Repeater的ItemDataBound事件里,给每个GridView绑定专属字典:
- 确保Repeater的数据源里包含每个GridView对应的专属字典(比如自定义一个类,同时存GridView要绑的数据和专属字典)。
- 在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(); } }
- 之后在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,而是在后台动态绑定事件,通过闭包直接捕获专属字典:
- 前台Repeater里的GridView去掉
OnRowDataBound属性:
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound"> <ItemTemplate> <asp:GridView ID="GridView1" runat="server"> <!-- 列定义 --> </asp:GridView> </ItemTemplate> </asp:Repeater>
- 在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属性可以存储任意对象,适合单次绑定的场景:
- 在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(); } }
- 在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
相关产品推荐
相关产品推荐

