【问题标题】:Child repeater's item count儿童中继器的项目计数
【发布时间】:2012-11-29 00:05:21
【问题描述】:

我正在尝试获取子中继器的项目计数,但由于某种原因它一直为零。这是我的代码:父中继器是 rptDays。子中继器是 rptEditInfo。

protected void rptDays_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Repeater rptEditInfo = (Repeater)e.Item.FindControl("rptEditInfo");
        ...
        DateTime thisDay = (DateTime)e.Item.DataItem;
        DataSet ds = new DataSet();
        ...
        ds = **bind valid dataset to this variable**
        rptEditInfo.DataSource = MRSTable;
        rptEditInfo.DataBind();
   }

}

protected void rptEditInfo_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Header)
    {
        Repeater rpt2 = (Repeater)((Repeater)e.Item.Parent);
        Repeater rpt1 = (Repeater)((Repeater)sender).Parent.FindControl("rptEditInfo");
        int countTest1 = rpt2.Items.Count //always zero
        int countTest2 = rpt1.Items.Count //always zero
    }
}

我做错了什么?数据有效且已填充。我唯一能想到的是我没有正确访问子中继器。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您无法在标题中获取项目计数 (e.Item.ItemType == ListItemType.Header)。项目将按以下顺序创建:

    1. 标题
    2. 1. 项目ItemCreated(计数=0,因为尚未绑定数据)
    3. 1. 项目 ItemDataBound(自第一个项目创建和数据绑定以来计数 = 1)
    4. 2. 项目ItemCreated(计数=1,因为尚未绑定数据)
    5. 2. 项目ItemDataBound(计数=2,因为第二个项目创建和数据绑定) ....

    所以ItemDataBound 不是从Items 属性中获取总数的正确阶段。但无论如何,更好的方法是直接使用数据源而不是计算项目(或GridView 中的行)。

    protected void rptEditInfo_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Header)
        {
            Repeater rpt = (Repeater)sender;
            //note that this depends on your actual datasource, set a breakpoint and debug if you're unsure
            var dataSource = (DataView)rpt.DataSource; 
            int count = dataSource.Count;
        }
    }
    

    【讨论】:

    • 非常感谢您的启发,这完全有道理。一个点和一个答案!
    【解决方案2】:

    您可能必须在第一个数据绑定事件中绑定嵌套中继器

    rptEditInfo.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(rptEditInfo_ItemDataBound);

    这可能会有所帮助。 http://www.mostlylucid.co.uk/articles/nestedrepeaters.htm

    【讨论】:

      【解决方案3】:

      您可以参考以下代码并用于解决您的问题:

      <<**** Global variable **************>>
      Public static int innerRepeaterCount=0;
      
      <<********* Your rptEditInfo_ItemDataBound event wiil be as follows*******>>
      
      
      
      protected void rptEditInfo_ItemDataBound(object sender, RepeaterItemEventArgs e) 
      {
          dv = e.Item.DataItem as DataRowView;  
         if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
          {
             nestedRCountInInnerR = nestedRCount;
             innerRepeaterCount++; 
          }
       }
      
      
       innerRepeaterCount will give you total item counts in inner Repeater
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-29
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多