2

アップデート:

行がnull

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();
4

3 に答える 3

3

FooterTemplateは各行でレンダリングされないため、このようにDateItemのコメントをフッターにバインドすることはできません。

フッターに表示したい日付チェック済みの日付は1つだけのようです。

行ごとに異なる可能性のあるDataItemのDateCheckedを探しています。

すべての行に同じDateCheckedが含まれている場合は、サーバー側のプロパティを作成して保存できます。すべてが同じでない場合は、Datecheckedの任意の行を使用できます。フッターに表示する日付を保存できます(任意の1つの日付にする必要があります)。フッターの次のブロックで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();
  }
} 
于 2012-04-12T14:15:17.107 に答える
3

フッターはデータセット全体に対して1回だけレンダリングされますが、アイテムテンプレートはコレクション内のすべてのアイテムに対してレンダリングされます。

編集

リピーターは次のようにレンダリングします。

ヘッダ

ItemTemplate

ItemTemplate

...(データソース内のアイテムごとに1つのアイテムテンプレート)

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>

編集終了

おそらく、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 */;
      }
   } 
于 2012-04-12T14:21:15.640 に答える
1

FooterTemplateはデータ項目にバインドされていませんリピーターが作成されると、 FooterTemplate内のコントロールはバインドされないため、データバインドされた式は評価されません。

できることは、FindControlメソッドを使用することです。

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

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

ご覧のとおり、First()メソッドを呼び出して単一のアイテムを取得しています。これは、レンダリングされたフッターが1つしかないためです。このため、このテンプレートはアイテム用ではないと言っています。

于 2012-04-12T14:17:06.217 に答える