我要做的是迭代转发器并读取一些控件值:
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());
}
}
}
}
如您所见,转发器在构造函数级别绑定。我正试图在页面按钮上发生事件时读取数据。
有什么想法吗?
答案 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
}