2012-04-12 117 views
1

更新:显示数据

行空

if (e.Item.ItemType == ListItemType.Footer) 
{ 
Label lblDateCreated = e.Item.FindControl("lblDateCreated ") as Label; 
DataRowView row = (DataRowView)e.Item.DataItem; //row is null here <<<< 
lblDateCreated .Text = row["DateChecked"].ToString(); 

} 

结束时更新:

如何显示在中继尾数据...

其非常愚蠢的是,我花了很多时间搞清楚,但如果我移动相同的itemtemplate然后它的显示,但不是在页脚...下面是我的代码..

<asp:Repeater ID="rpt" runat="server"> 
     <HeaderTemplate> 
      header... 
     </HeaderTemplate> 
     <ItemTemplate> 
      <div class="rpt"> 
       <div class="inner"> 
        <div> 
         <div class="ert"> 
          <%#DataBinder.Eval(Container.DataItem, "Comment")%> 
         </div> 
        </div> 
       </div> 
      </div> 
      <br /> 
     </ItemTemplate> 
     <FooterTemplate> 
      footer..... 
      <div id="datetime"> 
      <asp:Label ID="lblDateTime" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "DateChecked")%>'></asp:Label> 
      </div> 
      <div id="save"> 
      <p> 
       <asp:HyperLink ID="Hyperlink2" runat="server" NavigateUrl="~/link.aspx" 
        Text="More"></asp:HyperLink></p> 
      </div> 
     </FooterTemplate> 
    </asp:Repeater> 

后台代码:

rpt.DataSource = mydatasource; 
rpt.DataBind(); 
+0

修改我实在不明白页脚是如何将你想要的东西的工作。整个中继器只有一个页脚。如果DateChecked对于数据源的每一行都不相同,那么如何确定页脚中应显示的内容? – SouthShoreAK 2012-04-12 14:41:09

+0

我明白,但我怎么能在每一行的页脚数据? – 2012-04-12 14:46:31

+0

嗯看起来像我不得不使用中继器内的中继器? – 2012-04-12 14:51:06

回答

3

FooterTemplate不与每一行呈现的,所以你不能绑定DateItem的评论到页脚这样。

似乎只有一个Date Checked要显示在页脚中。

您正在寻找DataItem中的DateChecked,每个行可能不同。

如果所有的行都包含相同的DateChecked,您可以创建一个服务器端属性来存储它,您可以使用任何行Datechecked,如果所有行都是相同的,如果不是,则可以存储您希望显示在页脚中的任何日期(它应该是任何一个日期) 在页脚中使用以下块显示DateChecked <%= PropertyName%> 或 由于您已经将标签放置在页脚中,因此您可以使用此属性直接绑定服务器端的lblDateTime。

rpt.DataSource = mydatasource; 
rpt.DataBind(); 

var lblDateTime = rpt.FindControl("lblDateTime") as Label; 
if (lblDateTime != null) 
{ 
    lblDateTime.Text = mydatasource.First().DateChecked; 
} 

要页脚控制绑定中继

void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { 

    // This event is raised for the header, the footer, separators, and items. 

    // Execute the following logic for Footer only. 
    if (e.Item.ItemType == ListItemType.Footer) { 

     footerRepeater.DataSource = mydatasource; 
     footerRepeater.DataBind(); 
    } 
} 

ASPX

<asp:Repeater ID="rpt" runat="server"> 
    <HeaderTemplate> 
     header... 
    </HeaderTemplate> 
    <ItemTemplate> 
     <div class="rpt"> 
      <div class="inner"> 
       <div> 
        <div class="ert"> 
         <%#DataBinder.Eval(Container.DataItem, "Comment")%> 
        </div> 
       </div> 
      </div> 
     </div> 
     <br /> 
    </ItemTemplate> 
    <FooterTemplate> 
     footer..... 
     <asp:Repeater ID="rpt" runat="server"> 
     <ItemTemplate> 
      <div> 
       <asp:Label ID="lblDateTime" runat="server" DataBinder.Eval(Container.DataItem, "DateChecked")%>'></asp:Label> 
      </div> 
     </ItemTemplate> 
     </asp:Repeater> 
    </FooterTemplate> 
</asp:Repeater> 

CS

要页脚控制

void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { 

    // This event is raised for the header, the footer, separators, and items. 

    // Execute the following logic for Footer only. 
    if (e.Item.ItemType == ListItemType.Footer) { 

     footerRepeater.DataSource = mydatasource; 
     footerRepeater.DataBind(); 
    } 
} 
绑定中继器10
+0

所以对于每一行我都会有不同的DateChecked ...所以在这种情况下使用GridView是什么?或任何其他控制迭代? – 2012-04-12 14:22:17

+0

我已经更新了我的问题 – 2012-04-12 14:36:28

+0

在你必须把页脚模板内的另一个中继器,并绑定该转发器的RowDataBound事件的话,我已经更新了我的答案 – 2012-04-12 15:02:43

1

FooterTemplate未绑定到数据项。当构建中继器时,FooterTemplate中的控件不会绑定,因此不会评估数据绑定表达式。

你可以做的是使用FindControl方法。

rpt.DataSource = mydatasource; 
rpt.DataBind(); 

var lblDateTime = rpt.FindControl("lblDateTime") as Label; 
if (lblDateTime != null) 
{ 
    lblDateTime.Text = mydatasource.First().DateChecked; 
} 

你看,我打电话的第一个()方法来获得一个项目,这是因为只有一个绘制页脚,这就是为什么我说这个模板是不是为项目。

+0

我已更新我的问题 – 2012-04-12 14:36:34

+0

您仍然没有明白。 FooterTemplate没有实例化,当控制循环遍历项目时,在循环结束后创建。 – 2012-04-12 14:42:18

+0

我明白,但我怎么能在每一行页脚的数据? – 2012-04-12 14:46:54

3

页脚仅针对整个数据集呈现一次,而针对集合中的每个项目呈现项目模板。

EDIT

中继呈现像这样:

部首

的ItemTemplate

的ItemTemplate

...(用于在数据源的每个项目一个项目模板)

的ItemTemplate

的ItemTemplate

页脚

如果你想要的东西出现在每一行的页脚,你只需要到该标记添加到您的ItemTemplate

<ItemTemplate> 
     <div class="rpt"> 
      <div class="inner"> 
       <div> 
        <div class="ert"> 
         <%#DataBinder.Eval(Container.DataItem, "Comment")%> 
        </div> 
       </div> 
      </div> 
     </div> 
     <br /> 
     <div class="footer"> 
      footer..... 
      <div id="datetime"> 
       <asp:Label ID="lblDateTime" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "DateChecked")%>'></asp:Label> 
      </div> 
     </div> 
    </ItemTemplate> 

编辑完

你可能会覆盖th e ItemDataBound或DataBound事件,并在需要设置值时访问您的页脚。

MSDN

void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) { 

     // This event is raised for the header, the footer, separators, and items. 

     // Execute the following logic for Footer only. 
     if (e.Item.ItemType == ListItemType.Footer) { 

      ((Label)e.Item.FindControl("lblDateTime")).Text= /* your value */; 
     } 
    } 
+0

我已经更新了我的问题 – 2012-04-12 14:36:14

+0

DataBound是正确的事件(在ItemDataBound的页脚没有构建) – 2012-04-12 15:08:33