创建一个表,其中日期和时间为行,并具有与这些条目匹配的“任务”

时间:2013-11-18 13:13:53

标签: c# asp.net datetime repeater

我希望有可能解释,所以这里有!在C#和ASP.NET中,我想创建一个表格,向我显示哪些任务在哪些日期以及在什么时间表示2小时跨度。为了说明这一点,我将尝试在下面绘制它:

Date              Role 1     Role 2     Role n…
01-11-2013 00:00    
01-11-2013 02:00    
01-11-2013 04:00    
01-11-2013 06:00    
01-11-2013 08:00  Task 1
01-11-2013 10:00  Task 1
01-11-2013 12:00  Task 1
01-11-2013 14:00  Task 1
01-11-2013 16:00             Task 2
01-11-2013 18:00             Task 2
01-11-2013 20:00             Task 2
01-11-2013 22:00    
02-11-2013 00:00    
02-11-2013 02:00    
02-11-2013 04:00    
02-11-2013 06:00    
02-11-2013 08:00                        Task 3
02-11-2013 10:00                        Task 3
02-11-2013 12:00                        Task 3
02-11-2013 14:00                        Task 3
02-11-2013 16:00                        Task 3
02-11-2013 18:00                        Task 3
02-11-2013 20:00    
02-11-2013 22:00    
03-11-2013 00:00
03-11-2013 02:00    
03-11-2013 04:00    
...     

因此我将在SQL Server数据库中拥有数据,但我不确定的是如何创建表。我正在考虑使用ASP.NET Repeater,也许是嵌套的,也许是2个数据源,其中1是日期和时间,另一个是匹配的地方?至少对我来说,“硬件”是什么,是如何在没有匹配的情况下创建行?

任何帮助都表示赞赏,因为我不再那么强大了! :)

2 个答案:

答案 0 :(得分:0)

你应该更喜欢转发器到其他更复杂的ASP.net控件,除非你需要列表视图或gridview。

创建无匹配的行 - 从日期/时间列表开始,并将转发器绑定到此。根据事物的外观,您需要角色标题的转发器,以及表格中每列的转发器。即:

<tr>
  <td>Date</td>
  <asp:Repeater runat="server" id="rptHeadings">
    <td><%# Eval("Role") %>
  </asp:Repeater>
</tr>
<asp:Repeater runat="server" id="rptDateTimes" OnItemDataBound="rptDateTimes_DataBound">
  <tr>
    <td><%# Eval("Date") %>
    <asp:Repeater runat="server" id="rptTasks" OnItemDataBound="rptTasks_DataBound">
    <td>
        <asp:Literal runat="server" id="litTask" />
    </td>
    </asp:Repeater>
  </tr>
</asp:Repeater>

然后在你的代码隐藏中 - 处理rptDateTimes_DataBound事件以绑定你的rptTasks转发器,并处理rptTasks_DataBound事件以填充litTask的Text属性 - 如果有任务则设置文本,否则将其留空。例如:

protected void rptTasks_DataBound(object sender, RepeaterItemEventArgs e)
{
  if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return;

  if (/* logic to determine if task is done At given date by given role */)
  {
    litTask.Name = SomeTask.Name;
  }
}

答案 1 :(得分:0)

例如:

SQL表:

角色|来自|直到

首先,通过分组获取所有行数并将它们放入角色列表

您已经拥有了您的专栏(datetime + n * Role)

为日期时间和角色创建数据表。

datatable dt = new datatable();
dt.Columns.add("DateTime", typeof(datetime));
foreach(var j in roles)
{
 dt.columns.add(j);
}

然后选择最小和最大日期(或者只选择今天的所有日期),比如说你想要每隔一小时或半小时,为这个数量创建一个循环。

for(int i = 0; i < 24; i++) //this is the hourly notation
{
  datarow dr = new datarow();
  dr["Datetime"] = new datetime(year, month, day, i,0,0)
  for(int j = 0; j < roles.count; i++) // this is the role 
  {
    // here comes the selection logic for that row, NULL if nothing else is available
    dr[roles[j]] = something;
  }

  dt.rows.add(dr);
}

//将某些内容更改为逻辑以获取数据,double for循环将在每列中创建一个包含数据的行。如果没有数据可用,则简单地给出NULL。

我希望这种逻辑可以让你更进一步