【问题标题】:Bind Inner Repeater绑定内部中继器
【发布时间】:2015-01-02 09:43:08
【问题描述】:

我有以下中继器:

<asp:Repeater ID="repeater1" runat="server" OnItemDataBound="repeater1_ItemDataBound">
        <HeaderTemplate>
          ...
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td>
                 <asp:Label  runat="server" Text='<%#Eval("id")%>'> </asp:Label></td>
                <td>
                  <asp:Label runat="server" Text='<%#Eval("ssdvalue")%>'></asp:Label>
                </td>

                <td>
                    <asp:Repeater runat="server" ID="repeater2">
                        <ItemTemplate>
                          <asp:Label Text='<%#Eval("stptime")%>' runat="server"></asp:Label>
                        </ItemTemplate>
                    </asp:Repeater>
                </td>
  </tr>      
        </ItemTemplate>

    </asp:Repeater>

现在在上面的代码中有两个转发器:repeater1和repeater2(在标签内)

对于上面我写了以下代码:

DataSet ds = new DataSet();
    ds = cls.ReturnDataSet("sp_data",
         new SqlParameter("@From_Time", "2014-11-01 00:00:00.000"),
         new SqlParameter("@To_Time", "2014-11-03 00:00:00.000"));
    repeater1 .DataSource = ds.Tables[0];
    repeater1 .DataBind();

这将绑定repeater1。

对于Repeater2,我编写了以下代码:

 protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            DataSet ds = new DataSet();
            ds = cls.ReturnDataSet("sp_data",
                 new SqlParameter("@From_Time", "2014-11-01 00:00:00.000"),
                 new SqlParameter("@To_Time", "2014-11-03 00:00:00.000"));

            Repeater rpt = (Repeater)e.Item.FindControl("Repeater2");
            rpt.DataSource = ds.Tables[1];
            rpt.DataBind();

        }
    }

现在整个输出如下:

Id    Ssdvalue  stptime
1      112      3 hours 4hours 5 hours 6 hours 12minutes 20minutes
2      234      3 hours 4hours 5 hours 6 hours 12minutes 20minutes
3      450      3 hours 4hours 5 hours 6 hours 12minutes 20minutes
4      987      3 hours 4hours 5 hours 6 hours 12minutes 20minutes
5      456      3 hours 4hours 5 hours 6 hours 12minutes 20minutes
6      091      3 hours 4hours 5 hours 6 hours 12minutes 20minutes

但是上面的输出是不正确的。

I want output like Below:

   Id    Ssdvalue  stptime
    1      112      3 hours
    2      234      4hours
    3      450      5 hours
    4      987      6 hours
    5      456      12minutes
    6      091      20minutes

那么我怎样才能得到上面的输出呢?

【问题讨论】:

  • 您的 HTML 格式错误,因为您在彼此之间重复嵌套。我建议你是否用 gridview 替换子中继器。
  • 在Repeater1_ItemDataBound 中,您每次都将每个Repeater2 绑定到同一个DataSet - 您需要根据两者之间的关系对其进行过滤。即你怎么知道 ID 为 1 的中继器行应该显示 3 小时的 stptime?
  • 从 ds.table[0] 和 ds.tables[1] 输出的行数相同。
  • @deepak - 但你不能指望它足够聪明并自动映射它们。您需要提供任何正确的链接,以便它将 1 映射到 1?
  • 好的,但我该怎么做呢?我如何映射?

标签: c# asp.net asp.net-4.0 asprepeater


【解决方案1】:

这样做:-

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || 
          e.Item.ItemType == ListItemType.AlternatingItem)
       {
          DataSet ds = new DataSet();
          ds = cls.ReturnDataSet("sp_data",
                 new SqlParameter("@From_Time", "2014-11-01 00:00:00.000"),
                new SqlParameter("@To_Time", "2014-11-03 00:00:00.000"));         
        Label Label1 = (Label)e.Item.FindControl("Label1");
        Repeater rpt = (Repeater)e.Item.FindControl("Repeater2");
        var source = ds.Tables[1].AsEnumerable()
                .Where(x => x.Field<int>("Id") == Convert.ToInt32(Label1.Text))
                .Select(x => new 
                      { 
                          stptime= x.Field<DateTime>("stptime")
                      });
       rpt.DataSource = source ;
       rpt.DataBind();
      }
}

由于您需要使用相同的 Id 进行映射,因此您必须根据 Id 过滤数据,即 Id 1 将映射到 stpTime 3 小时等。因此,我们需要使用 LINQ Where 子句过滤我正在执行的主要数据源,并且我们从 Label 获取相应的 Id。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多