13

asp:repeaterのItemDataBoundイベント中に、データバインドされているアイテムを取得したいと思います。

私は次のことを試しました(これはstackoverflowの質問では受け入れられない答えでした):

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    Object dataItem = e.Item.DataItem;
    ...
}

しかしe.Item.DataItem、nullです。

ItemDataBoundというイベント中にデータバインドされているアイテムにアクセスするにはどうすればよいですか。アイテムがデータバインドされているときに、イベントItemDataBoundが発生すると想定します。

オブジェクトを取得して、表示方法を制御する手順を実行できるようにします。さらに、オブジェクトには、表示方法を充実させるための追加の便利なプロパティがある場合があります。

答え

ツールは正しい答えを持っていました。答えは、is(Item、AlternatingItem)のe.Item.Data場合にのみ有効です。e.Item.ItemTypeそれ以外の場合は無効です。私の場合、DataItemがないヘッダー(またはフッター)行でItemDataBoundイベントを受信して​​いました。

protected void myRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   // if the data bound item is an item or alternating item (not the header etc)
   if (e.Item.ItemType != ListItemType.Item && 
         e.Item.ItemType != ListItemType.AlternatingItem)
   {
      return;
   }

   Object dataItem = e.Item.DataItem;
   ...
}
4

6 に答える 6

17

すぐに、これが必要だと推測する必要があります。

if (e.Item.ItemType == ListItemType.Item ||
    e.Item.ItemType == ListItemType.AlternatingItem)
{
    //Put stuff here
}

結局、項目自体がヘッダー行またはフッター行を表している可能性があります。

于 2008-12-05T15:02:37.013 に答える
12

私は次のことを行うことでこれを達成したことを付け加えたかっただけです。

protected void rpt_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
      //determine if the row type is an Item
      if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
      {
        DataRowView row = (DataRowView)e.Item.DataItem;
        if (row["RowName"].ToString() == "value")
        {
          //INSERT CODE HERE
        }
      }
    }
于 2010-09-08T17:01:40.790 に答える
3

リピーター様向け

if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType...

次のように変更できます。

if (e.Item.DataItem != null) ...
于 2009-07-25T09:16:19.507 に答える
0

asp:ListView を扱っている場合は、次のようなことができます。

    protected void myLV_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType != ListViewItemType.DataItem)
        return;

    object dataItem = ((ListViewDataItem)e.Item).DataItem;

}

(質問のタイトルにはasp:repeaterについて言及されていないので、asp:listviewのコードを投稿すると役立つかもしれないと思いました)

于 2009-03-11T18:35:44.380 に答える
0

カスタム テンプレート バインディングを使用するリピーターの場合。次のテンプレートを使用できます。これを使用して、各データ項目を印刷ビュー用に 2 つの行に分割するテーブルを作成しました。

Repeater1.HeaderTemplate = new PrintTemplate(ListItemType.Header);
Repeater1.ItemTemplate = new PrintTemplate(ListItemType.Item);
Repeater1.AlternatingItemTemplate = new  PrintTemplate(ListItemType.AlternatingItem);
Repeater1.FooterTemplate = new PrintTemplate(ListItemType.Footer);

 public class PrintTemplate : ITemplate
{
    ListItemType templateType;

  public PrintTemplate(ListItemType type)
  {
     templateType = type;

  }
  public void InstantiateIn(System.Web.UI.Control container)
  {       
     Literal lc = new Literal();

     switch(templateType)
     {
        case ListItemType.Header:
           lc.Text = "<TABLE>";
           container.Controls.Add(lc);
           break;
        case ListItemType.Item:
        case ListItemType.AlternatingItem:
           //lc.Text = "<TR><TD>";
           lc.DataBinding += new EventHandler(TemplateControl_DataBinding);
           container.Controls.Add(lc);
           break;
        case ListItemType.Footer:
           lc.Text = "</TABLE>";
           container.Controls.Add(lc);
           break;
     }
  }

    private void TemplateControl_DataBinding(object sender,
    System.EventArgs e)
          {

              Literal lc;
              lc = (Literal)sender;
              RepeaterItem container = (RepeaterItem)lc.NamingContainer;
              ListItemType itmType = container.ItemType;

              //construct the repeater row using a custom function that switches on item type; HEADER vs ITEM vs ALTERNATINGITEM
              lc.Text += GetPopulatedRepeaterRow(dataInterface, container.DataItem, container.ItemType); 
              ...
于 2015-05-01T21:00:50.733 に答える