当前位置: 代码迷 >> ASP.NET >> repeater的e.item.dataitem为null有关问题
  详细解决方案

repeater的e.item.dataitem为null有关问题

热度:5746   发布时间:2013-02-25 00:00:00.0
repeater的e.item.dataitem为null问题
页面: <asp:Repeater runat="server" ID="rpt" OnItemDataBound="rpt_ItemDataBound">
  <HeaderTemplate>
  </HeaderTemplate>
  <ItemTemplate>
  <asp:CheckBox runat="server" ID="chk" />
  </ItemTemplate>
  </asp:Repeater>
代码:
  protected void Page_Load(object sender, EventArgs e)
  {
  if (!IsPostBack)
  {
  List<Model.Users> list = new DAL.Users().GetList();
  rpt.DataSource = list;
  rpt.DataBind();
  }
  }
  protected void btn_Click(object sender, EventArgs e) //统计按钮
  {
  int cnt = 0;
  foreach (RepeaterItem ri in rpt.Items)
  {
  if (ri.ItemType == ListItemType.Item)
  {
  Model.Users m = ri.DataItem as Model.Users;//这里运行为NULL
  if (m.Xb == "男")
  cnt++;
  }
  }
  }
问题1:运行Model.Users m = ri.DataItem as Model.Users后,m为null,不知道什么原因?怎么解决?为什么在ItemBound时间中可以使用Model.User m = e.Item.DataItem而且可以获得值,在btn事件中为什么不可以?
问题2:if (ri.ItemType == ListItemType.Item)为什么不写也可以,HeaderTemplate为什么没有被计入到rpt.Items中?
谢谢。

------解决方案--------------------------------------------------------
探讨
久仰孟子大名呀,谢谢啦
第二个没看懂,为什么在repeater的OnItemDataBound中都写上,if (e.item.itemtype=listitemtype.item || ....)
而上述不用?

------解决方案--------------------------------------------------------
上面描述不太正确
rpt.Items应该是不计入HeaderTemplate的
只包含数据绑定的项
Item和AlternatingItem 

从Reflector代码看
RepeaterItemCollection Items属性是通过
this.itemsCollection = new RepeaterItemCollection(this.itemsArray);
生成的
而itemsArray代表的是数据项
C# code
    if (this.itemsArray != null)    {        this.itemsArray.Clear();    }    else    {        this.itemsArray = new ArrayList();    }    if (!useDataSource)    {        dataItemCount = (int) this.ViewState["_!ItemCount"];        if (dataItemCount != -1)        {            data = new DummyDataSource(dataItemCount);            this.itemsArray.Capacity = dataItemCount;        }    }    else    {        data = this.GetData();        ICollection is2 = data as ICollection;        if (is2 != null)        {            this.itemsArray.Capacity = is2.Count;        }    }    if (data != null)    {        int itemIndex = 0;        bool flag = this.separatorTemplate != null;        dataItemCount = 0;        if (this.headerTemplate != null)        {            this.CreateItem(-1, ListItemType.Header, useDataSource, null);        }        foreach (object obj2 in data)        {            if (flag && (dataItemCount > 0))            {                this.CreateItem(itemIndex - 1, ListItemType.Separator, useDataSource, null);            }            ListItemType itemType = ((itemIndex % 2) == 0) ? ListItemType.Item : ListItemType.AlternatingItem;            RepeaterItem item = this.CreateItem(itemIndex, itemType, useDataSource, obj2);            this.itemsArray.Add(item);            dataItemCount++;            itemIndex++;        }        if (this.footerTemplate != null)        {            this.CreateItem(-1, ListItemType.Footer, useDataSource, null);        }    }
  相关解决方案