asp.net 使用Repeater问题时使用GridView EventHandler

fafcakar  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(147)

理想情况下,我想在GridView呈现之前运行一些代码,尽管我可能会在RowCreated或RowDataBound事件中执行。
我的问题是我使用中继器创建多个GridView。我想要运行的代码需要使用一个Dictionary,该Dictionary是为构建的每个特定网格视图定制的。所以,我想传递一个自定义参数给我使用的任何事件。
然而,我必须在单个(模板化的)GridView的标记/结构本身(OnRowDataBound="”)中定义事件。
那么,我如何告诉代码调用该事件,但传递一个额外的参数?
谢谢!

bihw5rsg

bihw5rsg1#

通常的方法是针对每个中继器“行”,然后您可以处理ONE 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的每一行。
然而,在一天结束的时候,你处理“任何”是你想要的关于一个GridView。它是一个GridView没有中继器,还是10个GridView内部的中继器?
这个“问题”和“解决方案”没有任何变化。
现在,假设对于每个GridView,如果酒店处于活动状态,我们希望突出显示该行。好吧,这是一个100%独立的问题,因为不管你处理的是1个GridView还是20个。
方法是相同的,对于典型的GridView格式,您可以再次使用GridView数据行绑定事件。因此,实际上,就像我们为repeater使用行数据绑定事件一样,我们可以为每个GridView执行相同的操作,并且我们可以为GridView的每行执行任何我们想要的操作。
因此,绑定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

(我在上面添加了Active列)。
所以,现在在我们的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

您注意到,与需要测试“交替”行的中继器不同,gridview不需要这样的测试。
所以,现在我们看到了这一点(网格视图中Active = true的任何行都会获得颜色设置)。

所以,是的,只需设置一个标准的GridView行数据绑定事件,实际上这对于一个GV的工作方式将对于其中的10个GV。
实际上,你的第二个问题真的不需要中继器,但只需要处理一个GridView,以及你想要驱动那个GridView的数据,然后当然,你想要为GridView的每一行做什么,你一次处理一个事情。

相关问题