ASP .NET - 如何通过转发器进行迭代?

时间:2010-04-04 11:51:22

标签: asp.net repeater

我要做的是迭代转发器并读取一些控件值:

   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());

            }
        }
    }
}

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

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

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

请注意,转发器有一个HeaderItemTemplate,ItemTemplate&amp; AlternateItemTemplate&amp; 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。 }

答案 1 :(得分:4)

要检查的一些事项:

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

  • 如果Session [“login”]为空,您的转发器将不会被加载 - 我认为您已经检查了这个?

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

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

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

答案 2 :(得分:2)

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

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