Silverlight 中的自定义网格控件

Custom grid control in Silverlight

在我们的一个迁移项目中,我们有一个 Silverlight 项目。该项目中使用的大多数控件都是自定义控件。 在其功能之一中,加载包含子项和父项记录的网格。最初只有父详细信息被加载,旁边有一个扩展符号。单击展开按钮时会加载子详细信息。

我需要知道当我们点击展开按钮时幕后到底发生了什么。当子记录更多时,加载需要时间。我尝试调试但没有回发调用。

如果您需要更多详细信息,请告诉我。

请指导。

那么,假设您正在倾销 silverlight?

然后嵌套一个网格,你可以说放入一个列表视图,然后在列表视图内部,我们放入一个网格视图。您可以尝试嵌套两个gridview,但我发现它们效果不佳,但是主网格的列表视图,然后是子网格的列表视图,然后网格视图就可以了。

因此,标记看起来像这样(列表视图,然后是嵌套的网格视图)。

   <asp:ListView ID="ListView1" runat="server" DataKeyNames="ID" >
       <ItemTemplate>
          <tr style="">
            <td><asp:Button ID="cmdView" runat="server" Text="+" onclick="cmdView_Click" /></td>
            <td><asp:Label ID="HotelNameLabel" runat="server" Text='<%# Eval("HotelName") %>' /></td>
            <td><asp:Label ID="CityLabel" runat="server" Text='<%# Eval("City") %>' /></td>
            <td><asp:Label ID="ProvinceLabel" runat="server" Text='<%# Eval("Province") %>' /></td>
            <td><asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description") %>' /></td>
          </tr>
          <tr>
            <td colspan="5">
               <asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" 
                 DataKeyNames="ID" CssClass="table table-hover" style="display:none;margin-left:3%;width:97%"  >
                    <Columns>
                        <asp:BoundField DataField="Firstname" HeaderText="Firstname" SortExpression="Firstname" />
                        <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
                        <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                           <asp:TemplateField HeaderText="Select">
                            <ItemTemplate>
                                <asp:CheckBox ID="ckSel" runat="server" OnCheckedChanged="ckSel_CheckedChanged"
                                    AutoPostBack="true"></asp:CheckBox>
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
            </td>
           </tr>
           </ItemTemplate>
       <LayoutTemplate>
        <table id="itemPlaceholderContainer" runat="server" class = "table table-hover" >
            <tr runat="server" style="">
                <th runat="server">View</th>
                <th runat="server">HotelName</th>
                <th runat="server">City</th>
                <th runat="server">Province</th>
                <th runat="server">Description</th>
            </tr>
            <tr id="itemPlaceholder" runat="server">
            </tr>
         </table>
       </LayoutTemplate>
    </asp:ListView>

现在公平地说,以上是我们在 SO 上的 post 中包含的标记(更多,没有人会阅读或打扰这个 post。

好的,加载列表视图的代码(主要部分)。会是这样的:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        LoadGrid()
    End If

End Sub

Sub LoadGrid()
    Dim strSQL As String

    strSQL = "SELECT * FROM tblHotels WHERE ID in (select hotel_Id from People)
             ORDER BY HotelName"

    Using cmdSQL As New SqlCommand(strSQL, New SqlConnection(My.Settings.TEST4))

        cmdSQL.Connection.Open()

        ListView1.DataSource = cmdSQL.ExecuteReader
        ListView1.DataBind()

    End Using

End Sub

输出:

好的,现在我们需要“+”按钮的代码。单击时,它会展开,并显示子 gridview。

那个代码是这样的:

Protected Sub cmdView_Click(sender As Object, e As EventArgs)

    Dim cmd As Button = sender

    'Dim gVR As ListViewDataItem = ListView1.Items(ListView1.SelectedIndex)
    Dim gVR As ListViewDataItem = cmd.Parent
    Dim gChild As GridView = gVR.FindControl("GridView2")   ' pluck out the grid for this row

    If gChild.Style("display") = "normal" Then
        ' if grid is already display, then hide it, and exit
        gChild.Style("display") = "none"
        Exit Sub
    End If

    gChild.Style("display") = "normal"
    Dim HotelPK As String = ListView1.DataKeys(gVR.DataItemIndex).Item("ID")

    ' only re-load if never loaded (can't re-load else blow out check boxes

    If gChild.Rows.Count = 0 Then
        Dim strSQL As String
        strSQL = "SELECT * from People where hotel_id = " & HotelPK

        Using cmdSQL As New SqlCommand(strSQL, New SqlConnection(My.Settings.TEST4))

            cmdSQL.Connection.Open()
            gChild.DataSource = cmdSQL.ExecuteReader
            gChild.DataBind()

        End Using
    End If

End Sub

请注意在您单击之前如何不加载子行。单击 + 按钮会产生以下结果:

并且 expand/close 的状态确实保持不变。

因此现在如果我们再次扩展,则不必重新加载数据。