理想情况下,我想在 GridView 渲染之前运行一些代码,尽管我可能可以在 RowCreated 或 RowDataBound 事件中执行此操作。
我的问题是我正在使用转发器创建多个 GridView。 我想要运行的代码需要使用针对构建的每个特定网格视图自定义的字典。 因此,我想将自定义参数传递给我使用的任何事件。
但是,我必须在单个(模板化)GridView 的标签/结构本身(OnRowDataBound="")中定义事件。
那么,我如何告诉代码调用该事件,但传递一个额外的参数?
谢谢!
一般方法是针对每个中继器“行”,然后您可以处理一个 GridView。
在大多数情况下,该事件将是转发器行数据绑定事件。
例如,我有一个中继器,可以重复引用列表。
对于每个中继器,我想要每个城市的酒店的网格视图。
所以,
repeater-> feed out list of thing to repeat
repeater->row data bound event - deal with ONE GridView
说出这个标记:
Enter City(s) for Hotels:
<asp:TextBox ID="txtCity" runat="server" Width="500px">
</asp:TextBox>
<asp:Button ID="cmdShow" runat="server"
Text="Show Hotels "
style="margin-left:30px"
OnClick="cmdShow_Click" CssClass="btn"
/>
<asp:Repeater ID="Repeater1" runat="server"
OnItemDataBound="Repeater1_ItemDataBound" >
<ItemTemplate>
<div style="width: 50%">
<h3><%# $"Hotels For City = {Eval("City")}" %></h3>
<asp:GridView ID="GridView1"
runat="server" CssClass="table">
</asp:GridView>
</div>
</ItemTemplate>
</asp:Repeater>
在上面,用户可以输入1个或10个城市。
因此我们要为用户输入的每个城市“重复”GridView。
我们的代码如下:
Protected Sub cmdShow_Click(sender As Object, e As EventArgs)
Dim rstMyCities As New DataTable
rstMyCities.Columns.Add("City")
Dim sCity As String = txtCity.Text.Replace(" ", "")
For Each City As String In sCity.Split(",")
Dim OneRow = rstMyCities.NewRow
OneRow("City") = City
rstMyCities.Rows.Add(OneRow)
Next
Repeater1.DataSource = rstMyCities
Repeater1.DataBind()
End Sub
因此,我们制作一个城市列表,并将其发送到中继器。
我们得到这个:
所以,现在我们一次处理一个网格。我们使用中继器的 Item Data Bound 事件。
Protected Sub Repeater1_ItemDataBound(sender As Object, e As RepeaterItemEventArgs)
If e.Item.ItemType = ListItemType.Item Or
e.Item.ItemType = ListItemType.AlternatingItem Then
Dim MyBindData As DataRowView = e.Item.DataItem
Dim cmdSQL As New SqlCommand(
"SELECT FirstName, LastName, City, HotelName, Description FROM tblHotelsA
WHERE City = @City ORDER BY FirstName ")
cmdSQL.Parameters.Add("@City", SqlDbType.NVarChar).Value = MyBindData("City")
Dim GV As GridView = e.Item.FindControl("GridView1")
GV.DataSource = MyRstP(cmdSQL)
GV.DataBind()
End If
End Sub
因此,您没有提及要传递给每个 GridView 的“内容”。或者也许您需要处理 GridView 的每一行。
但是,最终,您可以处理有关 ONE GridView 的“任何内容”。是一个没有中继器的 GridView,还是 10 个中继器内的 GridView?
这个“问题”和“解决方案”没有变化。
现在,假设对于每个 GridView,如果酒店处于活动状态,我们希望突出显示该行。嗯,这是一个 100% 独立的问题,因为无论您处理 1 个 GridView 还是 20 个 GridView 都没有关系。
方法是相同的,对于典型的 GridView 格式设置,您将再次使用 GridView 数据行绑定事件。因此,实际上,就像我们使用中继器的行数据绑定事件一样,我们可以对每个 GridView 执行相同的操作,并且我们可以为 Grid View 的每一行执行任何我们想要的操作。
因此,我们绑定 GridView 的转发器代码可以包括我为活动酒店准备的“活动”列。
所以,那么这个:
Protected Sub Repeater1_ItemDataBound(sender As Object, e As RepeaterItemEventArgs)
If e.Item.ItemType = ListItemType.Item Or
e.Item.ItemType = ListItemType.AlternatingItem Then
Dim MyBindData As DataRowView = e.Item.DataItem
Dim cmdSQL As New SqlCommand(
"SELECT FirstName, LastName, City, HotelName, Description, Active FROM tblHotelsA
WHERE City = @City ORDER BY FirstName ")
cmdSQL.Parameters.Add("@City", SqlDbType.NVarChar).Value = MyBindData("City")
Dim GV As GridView = e.Item.FindControl("GridView1")
GV.DataSource = MyRstP(cmdSQL)
GV.DataBind()
End If
End Sub
(我在上面添加了“活动”列)。
所以,现在在我们的 GridView 行数据绑定事件中,然后我可以这样做:
因此,我们将行数据绑定事件添加到 GV,如下所示:
<asp:Repeater ID="Repeater1" runat="server"
OnItemDataBound="Repeater1_ItemDataBound" >
<ItemTemplate>
<div style="width: 50%">
<h3><%# $"Hotels For City = {Eval("City")}" %></h3>
<asp:GridView ID="GridView1"
runat="server" CssClass="table"
OnRowDataBound="GridView1_RowDataBound"
>
</asp:GridView>
</div>
</ItemTemplate>
</asp:Repeater>
现在让我们突出显示基于 Active = true/false 的行。
这个:
Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs)
If e.Row.RowType = DataControlRowType.DataRow Then
Dim gData As DataRowView = e.Row.DataItem
If gData("Active") = True Then
e.Row.BackColor = System.Drawing.Color.LightSteelBlue
End If
End If
End Sub
您注意到,与需要测试“交替”行的中继器不同,网格视图不需要这样的测试。
所以,现在我们看到了这一点(网格视图中 Active = true 的任何行都会获得颜色设置)。
所以,是的,只需设置一个标准的 GridView 行数据绑定事件,实际上这对于一个 GV 的工作原理将适用于其中的 10 个 GV。
实际上,你的第二个问题实际上不需要中继器,而只需要处理一个 GridView,以及你想要驱动该 GridView 的数据,然后当然你想要对 GridView 的每一行执行什么操作您一次处理一排和一件事。