【问题标题】:How to find controls in a repeater header or footer如何在转发器页眉或页脚中查找控件
【发布时间】:2010-10-16 15:06:49
【问题描述】:

我想知道如何在 Asp.Net Repeater 控件的 HeaderTemplate 或 FooterTemplate 中找到控件。

我可以在 ItemDataBound 事件中访问它们,但我想知道之后如何获取它们(例如在页眉/页脚中检索输入的值)。

注意:我在找到答案后在这里发布了这个问题,以便我记住它(也许其他人可能会觉得这很有用)。

【问题讨论】:

    标签: asp.net controls repeater findcontrol


    【解决方案1】:

    正如 cmets 中所述,这仅在您为中继器绑定数据后才有效。

    标题中查找控件:

    lblControl = repeater1.Controls[0].Controls[0].FindControl("lblControl");
    

    页脚中查找控件:

    lblControl = repeater1.Controls[repeater1.Controls.Count - 1].Controls[0].FindControl("lblControl");
    

    带有扩展方法

    public static class RepeaterExtensionMethods
    {
        public static Control FindControlInHeader(this Repeater repeater, string controlName)
        {
            return repeater.Controls[0].Controls[0].FindControl(controlName);
        }
    
        public static Control FindControlInFooter(this Repeater repeater, string controlName)
        {
            return repeater.Controls[repeater.Controls.Count - 1].Controls[0].FindControl(controlName);
        }
    }
    

    【讨论】:

    • 只是一个挑剔的小注释 - 您需要在页脚示例中将 Controls[0] 中的“c”大写。
    • 这个答案刺痛了我的眼睛。
    • 这很好用。只需一个注意事项 - 这仅在您对中继器进行数据绑定后才有效。
    • 这是一种非常丑陋的方法……但它对我有用。非常感谢你!如果可能的话,我会给你超过 +1 的评价。
    【解决方案2】:

    更好的解决方案

    您可以在 ItemCreated 事件中检查项目类型:

    protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e) {
        if (e.Item.ItemType == ListItemType.Footer) {
            e.Item.FindControl(ctrl);
        }
        if (e.Item.ItemType == ListItemType.Header) {
            e.Item.FindControl(ctrl);
        }
    }
    

    【讨论】:

    • 你特别说ItemDataBound,这是ItemCreated,点赞。
    • 同意,更好的解决方案。只需保存对控件的引用即可。
    • 这是一个更好的方法。
    【解决方案3】:

    您可以在 ItemCreated 事件上对控件进行引用,然后再使用它。

    【讨论】:

    • 您只是问了以后如何访问它,pascal 给出的在该点设置参考以供以后使用的答案是完全有效的。
    【解决方案4】:

    在Repeater(页眉、项目、页脚)中找到控件

    public static class FindControlInRepeater
    {
        public static Control FindControl(this Repeater repeater, string controlName)
        {
            for (int i = 0; i < repeater.Controls.Count; i++)
                if (repeater.Controls[i].Controls[0].FindControl(controlName) != null)
                    return repeater.Controls[i].Controls[0].FindControl(controlName);
            return null;
        }
    }
    

    【讨论】:

      【解决方案5】:

      这是在 VB.NET 中,如果需要,只需转换为 C#:

      <Extension()>
      Public Function FindControlInRepeaterHeader(Of T As Control)(obj As Repeater, ControlName As String) As T
          Dim ctrl As T = TryCast((From item As RepeaterItem In obj.Controls
                         Where item.ItemType = ListItemType.Header).SingleOrDefault.FindControl(ControlName),T)
          Return ctrl
      End Function
      

      并轻松使用:

      Dim txt as string = rptrComentarios.FindControlInRepeaterHeader(Of Label)("lblVerTodosComentarios").Text
      

      尝试使其与页脚和项目控件一起使用 =)

      【讨论】:

        【解决方案6】:

        最好和最干净的方法是在 Item_Created 事件中:

         protected void rptSummary_ItemCreated(Object sender, RepeaterItemEventArgs e)
                {
                    switch (e.Item.ItemType)
                    {
                        case ListItemType.AlternatingItem:
                            break;
                        case ListItemType.EditItem:
                            break;
                        case ListItemType.Footer:
                            e.Item.FindControl(ctrl);
                            break;
                        case ListItemType.Header:
                            break;
                        case ListItemType.Item:
                            break;
                        case ListItemType.Pager:
                            break;
                        case ListItemType.SelectedItem:
                            break;
                        case ListItemType.Separator:
                            break;
                        default:
                            break;
                    }
            }
        

        【讨论】:

          【解决方案7】:
          private T GetHeaderControl<T>(Repeater rp, string id) where T : Control
          {
              T returnValue = null;
              if (rp != null && !String.IsNullOrWhiteSpace(id))
              {
                  returnValue = rp.Controls.Cast<RepeaterItem>().Where(i => i.ItemType == ListItemType.Header).Select(h => h.FindControl(id) as T).Where(c => c != null).FirstOrDefault();
              }
              return returnValue;
          }
          

          查找并转换控件。 (基于 Piyey 的 VB 答案)

          【讨论】:

            【解决方案8】:

            对于ItemDataBound

            protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
            {
                if (e.Item.ItemType == ListItemType.Header)//header
                {
                        Control ctrl = e.Item.FindControl("ctrlID");
                }
                else if (e.Item.ItemType == ListItemType.Footer)//footer
                {
                        Control ctrl = e.Item.FindControl("ctrlID");
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-03-13
              • 1970-01-01
              • 2014-08-05
              • 1970-01-01
              • 2011-02-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多