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 的状态确实保持不变。
因此现在如果我们再次扩展,则不必重新加载数据。
在我们的一个迁移项目中,我们有一个 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 的状态确实保持不变。
因此现在如果我们再次扩展,则不必重新加载数据。