寻找帮助我tripple嵌套中继器逻辑问题。ASP.Net嵌套中继器逻辑地狱
背景
我建立了预订房间和资源从SQL Server数据库中提取数据的时间表系统。
表结构
Table 1 - tblrooms
room_id (INT) PK
room_name (varchar(50))
room_resource (INT)
Table 2 - tblperiods
period_id (INT) PK
period_time_start (DATETIME)
period_time_end (DATETIME)
period_name (nvarchar(50))
Table 3 - tblbookings
booking_id (INT) PK
period_id (INT)
room_id (INT)
booking_status (INT)
booking_date (DATETIME)
booking_subject (nvarchar(50))
问题 我已经大部分得到了中继器拉出来的数据作为然而只需要第一列是不断填充,我真的很努力工作,如何将预订数据提取出来并根据需要制定时间表。 (请参阅什么,我已经得到了工作附截图)
ASPX页面代码
<asp:Repeater ID="drPeriods" runat="server" OnItemDataBound="drPeriods_OnItemDataBound">
<HeaderTemplate>
<table class="table table-striped table-bordered table-condensed">
<tr>
<th style="width:16.66%"><asp:Label ID="lblResourceHeader" runat="server" /></th>
</HeaderTemplate>
<ItemTemplate>
<th style="width:16.66%"><asp:Label ID="lblPeriod" runat="server" Text='<%# Eval("period_name") %>' /> - <asp:Label ID="lblPeriodStart" runat="server" Text='<%# Eval("period_time_start") %>' /> to <asp:Label ID="lblPeriodEnd" runat="server" Text='<%# Eval("period_time_end") %>' /></th>
</ItemTemplate>
<FooterTemplate>
</tr>
<asp:Repeater ID="drResources" runat="server" OnItemDataBound="drResources_OnItemDataBound">
<ItemTemplate>
<tr>
<td height="50">
<asp:Label ID="lblResource" runat="server" Text='<%# Eval("room_name") %>' />
<br /><asp:Label ID="lblResourceDetails" runat="server" />
</td>
<asp:Label ID="lblFreeBooking" runat="server" Visible="false" />
<asp:Repeater ID="drBookings" runat="server" OnItemDataBound="drBookings_OnItemDataBound">
<ItemTemplate>
<td height="50">
<asp:Label ID="lblCellContent" runat="server" />
</td>
</ItemTemplate>
</asp:Repeater>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
</FooterTemplate>
</asp:Repeater>
代码隐藏
Namespace Staff
Public Class Rb
Inherits System.Web.UI.Page
Private _periodId As Integer
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
txtDate.Text = Request.QueryString("d")
'check for weekend dates, show message if it is.
Dim iWeekday As Integer = Weekday(Request.QueryString("d"))
If iWeekday = 1 Or iWeekday = 7 Then
lblMsg.Text = "<div class='alert alert-info alert-block'><h4 class='alert-heading'><i class='icon-warning-sign'></i> It's the weekend.</h4><p>The date you have choosen is a weekend, resources cannot be booked on weekends.</p></div>"
lblMsg.Visible = True
drPeriods.Visible = False
Else
Dim objConnection As SqlConnection
Dim objCommand As SqlCommand
Dim objDataReader As SqlDataReader
objConnection = New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("OPSDConnectionString").ConnectionString)
'Get Periods
objCommand = New SqlCommand("SELECT period_id, CONVERT(char(5), period_time_start, 108) AS period_time_start, CONVERT(char(5), period_time_end, 108) AS period_time_end, period_name FROM tblrb_periods", objConnection)
Try
objConnection.Open()
objDataReader = objCommand.ExecuteReader()
If objDataReader.HasRows Then
drPeriods.DataSource = objDataReader
drPeriods.DataBind()
objDataReader.Close()
Else
drPeriods.Visible = False
lblMsg.Text = "<div class='alert alert-error alert-block'><h4 class='alert-heading'><i class='icon-warning-sign'></i> Error!</h4><p>Periods have not yet been setup, please set these up by selecting the periods tab above, if you cannot see this tab please ask the helpdesk administrator to set these up for you.</p></div>"
lblMsg.Visible = True
objDataReader.Close()
End If
Catch ex As Exception
'Inform of the error
Elmah.ErrorSignal.FromCurrentContext().Raise(ex)
Finally
objCommand.Dispose()
objConnection.Close()
objConnection.Dispose()
End Try
End If
End If
End Sub
Protected Sub drPeriods_OnItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles drPeriods.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
_periodId = e.Item.DataItem("period_id")
End If
If e.Item.ItemType = ListItemType.Header Then
Dim lblResourceHeader As Label = drPeriods.Controls(0).Controls(0).FindControl("lblResourceHeader")
Dim layoutView As Integer = Request.QueryString("v")
Select Case layoutView
Case 1 ' Rooms
lblResourceHeader.Text = "Rooms"
Case 2 ' Resources
lblResourceHeader.Text = "Resources"
Case 3 ' Both
lblResourceHeader.Text = "Rooms & Resources"
Case Else
lblResourceHeader.Text = "Rooms & Resources"
End Select
End If
If e.Item.ItemType = ListItemType.Footer Then
Dim objConnection As SqlConnection
Dim objCommand As SqlCommand
Dim objDataReader As SqlDataReader
'find repeater in the footer of drPeriods (repeater)
Dim drResources As Repeater = drPeriods.Controls(drPeriods.Controls.Count - 1).Controls(0).FindControl("drResources")
Dim layoutView As Integer = Request.QueryString("v")
'Get Rooms
objConnection = New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("OPSDConnectionString").ConnectionString)
Select Case layoutView
Case 1 ' Rooms
objCommand = New SqlCommand("SELECT * FROM tblrb_rooms WHERE room_resource = 1 ORDER BY room_name", objConnection)
Case 2 ' Resources
objCommand = New SqlCommand("SELECT * FROM tblrb_rooms WHERE room_resource = 2 ORDER BY room_name", objConnection)
Case 3 ' Both
objCommand = New SqlCommand("SELECT * FROM tblrb_rooms ORDER BY room_name", objConnection)
Case Else
objCommand = New SqlCommand("SELECT * FROM tblrb_rooms ORDER BY room_name", objConnection)
End Select
Try
objConnection.Open()
objDataReader = objCommand.ExecuteReader()
drResources.DataSource = objDataReader
drResources.DataBind()
objDataReader.Close()
Catch ex As Exception
'Inform of the error
Elmah.ErrorSignal.FromCurrentContext().Raise(ex)
Finally
objCommand.Dispose()
objConnection.Close()
objConnection.Dispose()
End Try
End If
End Sub
Protected Sub drResources_OnItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs)
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim lblResourceDetails As Label = e.Item.FindControl("lblResourceDetails")
If e.Item.DataItem("room_resource") <> 2 Then
lblResourceDetails.Text = "[ <a href='#' class='withajaxpopover' title='Room Details' data-load='resourceManagerViewDetails.aspx?id=" & e.Item.DataItem("room_id") & "'>View Room Details</a> ]"
End If
Dim objConnection As SqlConnection
Dim objCommand As SqlCommand
Dim objDataReader As SqlDataReader
Dim drBookings As Repeater = e.Item.FindControl("drBookings")
Dim lblFreeBooking As Label = e.Item.FindControl("lblFreeBooking")
'Get Bookings
objConnection = New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("OPSDConnectionString").ConnectionString)
objCommand = New SqlCommand("SELECT tblrb_bookings.booking_status, tblrb_bookings.booking_subject, tblrb_bookings.booking_notes FROM tblrb_bookings WHERE (tblrb_bookings.room_id = @room_id) AND (tblrb_bookings.booking_date = @booking_date) AND (tblrb_bookings.period_id = @period_id)", objConnection)
objCommand.Parameters.Add("@room_id", SqlDbType.Int, 10).Value = e.Item.DataItem("room_id")
objCommand.Parameters.Add("@period_id", SqlDbType.Int, 10).Value = _periodId
objCommand.Parameters.Add("@booking_date", SqlDbType.DateTime).Value = Request.QueryString("d")
Try
objConnection.Open()
objDataReader = objCommand.ExecuteReader()
If objDataReader.HasRows Then
drBookings.DataSource = objDataReader
drBookings.DataBind()
objDataReader.Close()
Else
'free period
lblFreeBooking.Text = "<td height='50'><div class='alert alert-block alert-success'><h4 class='alert-heading'><i class='icon-ok'></i> Free.</h4><p><a href='#'>Click here to book this resource.</a></p></div></td>"
lblFreeBooking.Visible = True
End If
Catch ex As Exception
'Inform of the error
Elmah.ErrorSignal.FromCurrentContext().Raise(ex)
Finally
objCommand.Dispose()
objConnection.Close()
objConnection.Dispose()
End Try
End If
End Sub
Protected Sub drBookings_OnItemDataBound(sender As Object, e As System.Web.UI.WebControls.RepeaterItemEventArgs)
Dim lblCellContent As Label = e.Item.FindControl("lblCellContent")
Select Case e.Item.DataItem("booking_status")
Case 1
'timetabled
lblCellContent.Text = "<div class='alert alert-block alert-error'><h4 class='alert-heading'><i class='icon-warning-sign'></i> Timetabled.</h4><p>" & e.Item.DataItem("booking_subject") & "</p></div>"
Case 2
'user booked
lblCellContent.Text = "<div class='alert alert-block'><h4 class='alert-heading'><i class='icon-warning-sign'></i> Booked.</h4><p>" & e.Item.DataItem("booking_subject") & ".</p></div>"
End Select
End Sub
Protected Sub btnDateSelect_Click(sender As Object, e As System.EventArgs) Handles btnDateSelect.Click
'quick reload of page
Response.Redirect("resourceManager.aspx?v=" & Request.QueryString("v") & "&d=" & txtDate.Text)
End Sub
End Class End Namespace
谁能与我如何能得到帮助所需的布局,以便当建立时间表时,房间和时段包含他们的每个小区的正确预订数据相应的栏目。
预先感谢您可以提供任何指针,已经花了3天的时候我可以用新鲜的一双眼睛:-)
问候做,
奥兹
感谢SQL从未想过在一次快速命中中将其拉出。转储到数据表中也很有意义。所以为了得到期间头文件,我仍然需要3个嵌套中继器是否正确?已经添加了上面的建议,但在运行时,我得到一个错误,room_name不存在查看数据我看到列标题不存在如何引用room_name的位置在数据表中,在这种情况下5? – OPSL 2012-08-05 19:48:07
现在得到了房间名称,我的错误没有注意:-)有更多的游戏与您的建议,并会letyou知道我如何继续下去。 – OPSL 2012-08-05 20:42:49
你需要第三个中继器,但它不会嵌套。我已经通过回答修改以显示它会去的地方。至于RoomName,其意图是从分组的Key属性中访问它 - 这是GroupBy进入后的.Select(new {...})位的地方 – Richard 2012-08-05 20:42:57