Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Net嵌套中继器逻辑地狱_Asp.net_Sql Server_Nested Repeater - Fatal编程技术网

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 &amp; 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 &amp; 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>