【问题标题】:ASP .NET - How to Iterate through a repeater?ASP .NET - 如何遍历中继器?
【发布时间】:2010-04-05 00:06:06
【问题描述】:

我想要做的是遍历转发器并读取一些控件值:

   foreach (RepeaterItem iter in TablePanier.Items)
    {
        string guid = ((HiddenField)iter.FindControl("guid")).Value.ToString();

        // nombre exemplaires du livre

        int nbExemplaires = int.Parse(((System.Web.UI.WebControls.TextBox)iter.FindControl("txtNbExemplaires")).Text.ToString());

    }

如您所见,我有一个 HiddenValue 和一个 TextBox。不幸的是,这不起作用,没有正确读取值。

怎么了?

谢谢!

编辑: 这是表单的完整代码:

public partial class Panier : System.Web.UI.Page
{
    Bussiness.Manager _manager = new Bussiness.Manager("MSSQLSERVER");
    IEnumerable<Bussiness.iPanier> _paniers;
    CurrencyConvertor _currencyConvertor = new CurrencyConvertor();
    Bussiness.iCommande _commande;
    int  idPanier;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["login"] != null)
        {
            Security security = new Security();
           _paniers = _manager.chargerPannierUtilisateur(Session["login"].ToString());

            foreach (Bussiness.iPanier p in _paniers)
            {
                idPanier = p.id;
                TablePanier.DataSource = p.Livres;
                TablePanier.DataBind();
            }
        }

        else
        {
            Response.Redirect("~/Accueil.aspx");
        }
    }
    protected void btnCommande_Click(object sender, EventArgs e)
    {


        foreach (RepeaterItem iter in TablePanier.Items)
        {
            // id livre courant
            if (iter.ItemType == ListItemType.Item || iter.ItemType == ListItemType.AlternatingItem)
            {
                string guid = ((HiddenField)iter.FindControl("guid")).Value.ToString();
                int nbExemplaires = int.Parse(((System.Web.UI.WebControls.TextBox)iter.FindControl("txtNbExemplaires")).Text.ToString());

            }
        }
    }
}

如您所见,转发器绑定在构造函数级别。当页面的按钮上发生事件时,我正在尝试读取数据。

有什么想法吗?

【问题讨论】:

  • 代码看起来不错 - 你从哪里调用它?如果在转发器数据绑定之前调用它,控件将没有值。
  • 我看不出您粘贴的代码有什么问题。当您说这些值“未正确读取”时,您是什么意思?
  • @Ray:中继器数据绑定后。 @Matti virkkunen:未读取值!
  • 你在调试器中看过这个吗? FindControl 工作吗?你在回发中调用这个吗?如果您可以显示您正在执行的事件和方法调用的顺序,包括数据绑定和您发布的代码,那么也许有人会发现问题。
  • 这样的代码示例可以正常工作。问题可能在于您在生命周期中尝试访问 RepeaterItems 的位置。

标签: asp.net repeater


【解决方案1】:

取决于您拥有控件的位置。

请注意中继器有一个HeaderItemTemplate、ItemTemplate & AlternateItemTemplate & FooterItemTemplate。

因此,当您遍历中继器的 Item 集合时,您需要知道在访问控件对象之前要查找哪些模板。

通常您需要编写如下代码:

foreach(RepeaterItem item in TablePanier.Items){

 if(item.ItemType == ListItemType.HeaderItem){
  // do something with the header
 }
 else if(item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem){
  // do something with the item
    var guid_control = item.FindControl("guid") as HiddenField;
    var nbExemplaires = item.FindControl("txtNbExemplaires") as TextBox;
 }
 else if(item.ItemType == ListItemType.FooterItem){
  // do something with the footer
 }

HTH。 }

【讨论】:

    【解决方案2】:

    需要检查的几件事:

    • 转发器在初始请求和回发时都绑定在 Page_Load 中。因此,当单击按钮发布页面时,转发器会重新加载原始数据。用户输入的任何内容都会丢失。这是你想要的吗?如果没有,请使用 IsPostBack 属性仅在 GET 请求上加载它。

    • 如果 Session["login"] 为空,您的中继器将不会被加载 - 我想您已经检查过了?

    • 在您发布的代码中,您没有对尝试从中继器控件获取的值执行任何操作。这是因为没有显示额外的代码吗?

    • 您是否使用调试器检查了 FindControl 找到的控件以确保它们存在并且它们是您认为的那样?

    • 当您说“未读取值”时,您的意思是您得到空值吗?空字符串?

    【讨论】:

      【解决方案3】:

      检查项目类型 - 您应该寻找一个项目或交替项目类型。

      if ( iter.ItemType == ListItemType.Item || iter.ItemType = ListItemType.AlternatingItem ) {
      // find controls and do something
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多