Asp.net Net嵌套中继器逻辑地狱
我正在寻找关于三重嵌套中继器逻辑问题的帮助 背景Asp.net Net嵌套中继器逻辑地狱,asp.net,sql-server,nested-repeater,Asp.net,Sql Server,Nested Repeater,我正在寻找关于三重嵌套中继器逻辑问题的帮助 背景 我正在构建一个时间表系统,用于从SQLServer数据库中获取预订房间和资源的数据 表格结构 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_en
我正在构建一个时间表系统,用于从SQLServer数据库中获取预订房间和资源的数据 表格结构
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>
]
如果结束
Dim objConnection作为SqlConnection
Dim objCommand As SqlCommand
Dim objDataReader作为SqlDataReader
Dim drBookings As Repeater=e.Item.FindControl(“drBookings”)
Dim lblFreeBooking As Label=e.Item.FindControl(“lblFreeBooking”)
“预订
objConnection=新的SqlConnection(System.Configuration.ConfigurationManager.ConnectionString(“OPSDConnectionString”).ConnectionString)
objCommand=New SqlCommand(“选择tblrb_bookings.booking_status,tblrb_bookings.booking_subject,tblrb_bookings.bookings.booking_notes FROM tblrb_bookings,其中(tblrb_bookings.room_id=@room_id)和(tblrb_bookings.bookings_date=@booking_date)和(tblrb_bookings.period_bookings.period=@period_id=@period_id)”,objConnection)
objCommand.Parameters.Add(“@room\u id”,SqlDbType.Int,10).Value=e.Item.DataItem(“room\u id”)
objCommand.Parameters.Add(“@period\u id”,SqlDbType.Int,10).Value=\u periodId
objCommand.Parameters.Add(“@booking_date”,SqlDbType.DateTime).Value=Request.QueryString(“d”)
尝试
objConnection.Open()
objDataReader=objCommand.ExecuteReader()
如果objDataReader.HasRows,则
drBookings.DataSource=objDataReader
drBookings.DataBind()
objDataReader.Close()
其他的
“自由期
lblFreeBooking.Text=“免费。”
lblFreeBooking.Visible=True
如果结束
特例
“告知错误
Elmah.ErrorSignal.FromCurrentContext().Raise(ex)
最后
objCommand.Dispose()
objConnection.Close()
objConnection.Dispose()
结束尝试
如果结束
端接头
受保护的子drBookings\u OnItemDataBounded(发件人作为对象,e作为System.Web.UI.WebControl.RepeaterItemEventArgs)
Dim lblCellContent As Label=e.Item.FindControl(“lblCellContent”)
选择案例e.Item.DataItem(“预订状态”)
案例1
“时间表
lblCellContent.Text=“Timetabled.”&e.Item.DataItem(“预订主题”)和“”
案例2
'用户已预订
lblCellContent.Text=“预订.”和e.Item.DataItem(“预订主题”)&“”
结束选择
端接头
受保护的子BTNDeselect\u单击(发件人作为对象,e作为System.EventArgs)处理BTNDeselect。单击
'快速重新加载页面
Response.Redirect(“resourceManager.aspx?v=“&Request.QueryString(“v”)和“&d=“&txtDate.Text”)
端接头
结束类结束命名空间
有谁能帮助我获得所需的布局,以便在建立时间表时,房间和时段在相应的列中包含每个单元的正确预订数据
提前感谢您提供的任何建议,花了3天时间,我可以用一双新鲜的眼睛来做这件事:-)
问候,
奥齐
我突然想到的一件事是这句话
Dim drResources As Repeater = drPeriods.Controls(drPeriods.Controls.Count - 1).Controls(0).FindControl("drResources")
试着用类似的东西替换它
Dim drResources As Repeater = e.Item.FindControl("drResources")
(语法可能有点不正确-我的VB很脆弱:)
我还将删除
try catch
,直到基本功能正常为止-可能是生成了一个错误,但您永远看不到它。首先,我认为您的控制方式过于复杂。如果要使用LINQ或EF访问数据库,您可以使用两个嵌套的中继器,而不需要复杂的操作隐藏代码。但是,您可以先将查询简化为以下内容:
SELECT *
FROM tblperiods p
CROSS JOIN tblrooms r
LEFT JOIN tblbookings b ON p.period_id = b.period_id AND r.room_id = b.room_id AND b.booking_date = '2012-08-01'
这将为您提供足够的信息,以便在给定的一天的单个查询中生成整个输出。如果您不想使用EF或LINQ to SQL,您仍然可以使用LINQ魔术将其按房间进一步分离出来,然后将其用于数据绑定(请原谅C#,VB.NET有点生疏!):
DataTable dt=newdatatable();
dt.Fill(objDataReader);//将所有数据加载到数据表中
var groupedRows=dt.Rows.Cast().GroupBy(row=>new{RoomId=(int)row[“room\u id”],RoomName=(string)row[“room\u name”]});
rpRows.DataSource=groupedRows;
rpRows.DataBind();
然后你会有这样的中继器:
<table>
<thead><tr><th>Rooms & Resources</th>
<asp:Repeater runat="server" id="rpHeader">
<ItemTemplate>
<td><%# Eval("period_name") %></td>
</ItemTemplate>
</asp:Repeater>
</tr></thead>
<asp:Repeater runat="server" id="rpRows">
<ItemTemplate>
<tr>
<th><!-- Put room header stuff here --><%# Eval("Key.RoomName") %></th>
<asp:Repeater runat="server" DataSource="<%# Container.DataItem %>">
<ItemTemplate>
<td>
<!-- Per-booking info -->
<asp:Label runat="server" Visible='<%# Eval("booking_id") == DBNull.Value %>'>Not Booked</asp:label>
<asp:Label runat="server" Visible='<%# Eval("booking_id") != DBNull.Value %>'>Booked!</asp:label>
</td>
</ItemTemplate>
</asp:Repeater>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
房间及资源
未预订
预定!
我没有给出数据绑定标题行的代码,但这只是一个select*from tbl\u periods
请注意,这些代码都没有经过测试,可能需要对数据绑定进行一些调整。这两个版本都可以正常工作。我对这些代码进行了扩展测试,这个问题围绕着屏幕截图中的第一列(P1-09:00到10:00)预订的好处应该在最后一列中,就像所有其他数据都被忽略一样。我想知道有三个嵌套的中继器是否是最好的方法?感谢SQL从未想过一下子就将其取出。将其转储到datatable中也很有意义。
DataTable dt = new DataTable();
dt.Fill(objDataReader); // Loads all data into the DataTable
var groupedRows = dt.Rows.Cast<DataRow>().GroupBy(row => new { RoomId = (int) row["room_id"], RoomName = (string) row["room_name"] });
rpRows.DataSource = groupedRows;
rpRows.DataBind();
<table>
<thead><tr><th>Rooms & Resources</th>
<asp:Repeater runat="server" id="rpHeader">
<ItemTemplate>
<td><%# Eval("period_name") %></td>
</ItemTemplate>
</asp:Repeater>
</tr></thead>
<asp:Repeater runat="server" id="rpRows">
<ItemTemplate>
<tr>
<th><!-- Put room header stuff here --><%# Eval("Key.RoomName") %></th>
<asp:Repeater runat="server" DataSource="<%# Container.DataItem %>">
<ItemTemplate>
<td>
<!-- Per-booking info -->
<asp:Label runat="server" Visible='<%# Eval("booking_id") == DBNull.Value %>'>Not Booked</asp:label>
<asp:Label runat="server" Visible='<%# Eval("booking_id") != DBNull.Value %>'>Booked!</asp:label>
</td>
</ItemTemplate>
</asp:Repeater>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>