2012-04-12 7 views
1

更新:データの表示

列が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(); 

} 

ENDのUPDATE:?リピータフッター内のデータを表示する方法

...

その非常に愚かなことが分かりました。しかし、私が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

から変更

私は本当にフッターはあなたが望むもののために働くために起こっているか表示されません。リピータ全体には1つのフッターしかありません。 'DateChecked'がデータソースの各行ごとに異なる場合、フッターに何を表示するべきかをどのように決定しますか? – SouthShoreAK

+0

私は理解していますが、どのように各行のフッターにデータを入れることができますか? –

+0

私はリピーターの中でリピーターを使用する必要があるように見えますか? –

答えて

3

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

フッターに表示する日付チェックが1つしかないようです。

行ごとに異なるDataItemでDateCheckedが検索されています。

すべての行に同じDateCheckedが含まれている場合は、それを格納するサーバーサイドプロパティを作成できます。任意の行を使用できます。すべてチェックします。同じものがすべて同じ場合は、フッターに表示する日付1つの日付) フッターに次のブロックを使用してDateCheckedを表示します <%= PropertyName%> または すでにフッターにLabelを配置しているので、このプロパティを使用してサーバー側から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(); 
    } 
} 
+0

だから、すべての行に対して、私は異なるDateCheckedを持っています...だからこのシナリオではGridViewを使うのですか?または反復する他のコントロール? –

+0

私の質問が更新されました –

+0

その場合、別のリピータをフッターテンプレート内に配置し、このリピータをRowDataBoundイベントにバインドする必要があります。回答は –

1

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

あなたができることは、FindControlメソッドを使用することです。あなたが見

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

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

私は単一の項目を取得するためにまず()メソッドを呼んでいる私は、このテンプレートは、アイテムのためではないことを言っている理由を一つだけレンダリングフッター、これがあるので、これはです。

+0

私は質問を更新しました –

+0

あなたはまだアイデアを得ていません。 FooterTemplateは、コントロールが項目をループするときにインスタンス化されず、ループが終了した後に作成されます。 –

+0

私は理解していますが、各行のフッターにどのようにデータを入れることができますか? –

3

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

EDIT

リピータはそうようにレンダリング:

ヘッダ

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> 

ENDのEDITにそのマークアップを追加する必要が

おそらく、 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

私の質問を更新しました –

+0

DataBoundは適切なイベントです(フッターが作成されていないItemDataBoundにあります) –