Update panel dans repeater

Résolu
cs_rastali Messages postés 13 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 21 mars 2008 - 5 déc. 2007 à 16:17
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 - 9 déc. 2007 à 19:53
Bonjour,

alors j'ai un petit probleme avec mon appli web. Je travaille avec le framework 2.0 sous visual studio 2005.
J'ai un écran qui affiche un repeater avec des données récupérées de ma base oracle. Dans ce repeater j'affiche un tableau, et une des colonnes contient un textbox et deux boutons, l'un permettant d'incrémenter la valeur numérique afficher dans le textbox de 1, et l'autre permettant de décrémenter la valeur. Tout cela fonctionne parfaitement bien, mais a chaque click sur l'un des boutons, c'est toute la page qui se rafraichit, et c'a fait un peu mal aux yeux a force :D.
Je souhaitais donc que le click sur mon bouton ne me rafraichisse que mon text box. Pour cela je me suis tourné vers ajax et l'update panel qui me semblait etre une bonne solution, sauf qu'au sein de mon repeater, ca ne fonctionne pas!
1-Ma premiere question est donc toute simple, est-ce possible d'intégrer un update panel dans un repeater? Et si oui, avez vous un exemple? ou si non, existe-t-il un autre moyen de ne raffraichir que mon textbox?
Ensuite j'ai une autre question concernant ajax plus généralement.
2-Mon projet est un projet asp.net site web classic, est-ce que je peux en ajoutant les composants ajax utilisé du ajax dans mon code, ou dois-je forcement créer un projet asp.net ajax-enabled website ?

5 réponses

cs_rastali Messages postés 13 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 21 mars 2008
6 déc. 2007 à 11:25
Yo!

en fait j'ai trouvé la réponse moi même
Je placais mal l'updatePanel, j'ai fait l'erreur de vouloir le mettre autour du champs a mettre a jour alors qu'en fait il fallait le mettre autour du repeater.
Donc en gros il faut faire:

<ContentTemplate
>
<fieldset>

<asp:Repeater
ID="rptClasses"
runat="server"
OnItemCommand="rptClassesItemCommand"
EnableViewState="false">
<HeaderTemplate>

...........
</HeaderTemplate>
<ItemTemplate>
..........
</ItemTemplate>
<AlternatingItemTemplate>
..........
</AlternatingItemTemplate>
</asp:Repeater>
</fieldset>
</ContentTemplate>
</asp:UpdatePanel>

et ca fonctionne !!!
3
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
5 déc. 2007 à 19:48
Bonjour,

1. Oui, c'est possible ! Mais faut binder correctement ou utiliser le viewstate, comment bind tu ton repeater ? utilises tu le viewstate ? as tu un message d'erreur ? que se passe t'il actuellement ?

2. Un site web ASP.net Ajax Enabled n'est rien d'autre qu'un site web classique avec un web.config un poil modifié :-)

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
cs_rastali Messages postés 13 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 21 mars 2008
6 déc. 2007 à 10:23
salut, et merci de ta réponse ^^
alors pour la question 2, c'est bon j'ai réussi a adapter mon web.config en m'inspirant d'un web.config d'un projet ajax. J'arrive donc sur une page de test, et sans repeater, à mettre a jour uniquement mon textbox.
Par contre, avec le repeater j'ai un probleme, directement a la compilation :s .

donc mon code aspx:

<

asp:Repeater
ID="rptClasses"
runat="server"
OnItemCommand="rptClassesItemCommand"
EnableViewState="false">
<HeaderTemplate>

<table
style="border-collapse:collapse; background-color:#BBBBBB;">
<tr>
<td
style="border:1px solid #000000; width:100px"><b>Code
</b></td>
<td
style="border:1px solid #000000; width:100px"><b>Description
</b></td>
<td
style="border:1px solid #000000; width:120px"><b>Valeur</b></td>
</tr>
</table>

</HeaderTemplate>
<ItemTemplate>
<table
style="border-collapse:collapse; background-color:#fbfcfd;">
<tr>
<td
style="border:1px solid #000000; width:100px"><center><asp:Label
ID="lblCode"
runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "CODE") %>
'></asp:Label></center></td>
<td
style="border:1px solid #000000; width:100px"><asp:Label
ID="lblDescription"
runat="server"
Text='<%# DataBinder.Eval(Container.DataItem, "DESCRIPTION") %>
'></asp:Label></td>
<td
style="border:1px solid #000000; width:120px">
<asp:UpdatePanel
ID="UP1"
runat="server">

<ContentTemplate>
<fieldset>
<asp:TextBox
runat="server"
ID="tbValeur"
Width="50"
Text='<%# DataBinder.Eval(Container.DataItem, "Valeur") %>
'></asp:TextBox>
<asp:Button
id="btnPlus"
runat="server"
CommandName='<%# ACTIONPLUS %>
'
CommandArgument='<%# DataBinder.Eval(Container.DataItem, "CODE") %>
'
Text="+"
/>
<asp:Button
id="btnMoins"
runat="server"
CommandName='<%# ACTIONMOINS %>
'
CommandArgument='<%# DataBinder.Eval(Container.DataItem, "CODE") %>
'
Text="-"
/>
</fieldset>
</ContentTemplate>
</asp:UpdatePanel>
</td>
</tr>
</table>
</ItemTemplate>
<AlternatingItemTemplate>
<table
style="border-collapse:collapse; background-color:#d7e4ed;">
<tr>
<tdstyle="border:1px solid #000000; width:100px"><center><asp:LabelID="lblCode"runat="server"Text='<%# DataBinder.Eval(Container.DataItem, "CODE") %>'></asp:Label></center></td>
<tdstyle="border:1px solid #000000; width:100px"><asp:LabelID="lblDescription"runat="server"Text='<%# DataBinder.Eval(Container.DataItem, "DESCRIPTION") %>'></asp:Label></td>
<tdstyle="border:1px solid #000000; width:120px">
<asp:UpdatePanelID="UP1"runat="server">
<ContentTemplate>
<fieldset>
<asp:TextBoxrunat="server"ID="tbValeur"Width="50"Text='<%# DataBinder.Eval(Container.DataItem, "Valeur") %>'></asp:TextBox>
<asp:Buttonid="btnPlus"runat="server"CommandName='<%# ACTIONPLUS %>'CommandArgument='<%# DataBinder.Eval(Container.DataItem, "CODE") %>'Text="+"/>
<asp:Buttonid="btnMoins"runat="server"CommandName='<%# ACTIONMOINS %>'CommandArgument='<%# DataBinder.Eval(Container.DataItem, "CODE") %>'Text="-"/>
</fieldset>
</ContentTemplate>
</asp:UpdatePanel>
</td>
</tr>
</table>
</AlternatingItemTemplate>
</asp:Repeater>

et mon code cs:

private
void InitRptClasses()
{

try
{

//on recupere les donn‚es de la base
DataTable DtClasses=
new
DataTable();

DtClasses=
ClsClasse.SelectClasse().Tables[0];

//alimentation du repeater
rptClasses.DataSource = DtClasses;
rptClasses.DataBind();
}

catch (
Exception ex)
{

Util.Log(
"Erreur : InitRptClasses : " + ex.Message);
}
}

public
void rptClassesItemCommand(
object source, System.Web.UI.WebControls.
RepeaterCommandEventArgs e)
{

string code = e.CommandArgument.ToString();

if (e.CommandName == ACTIONPLUS)
{
ValeurPlus(code);
}

if (e.CommandName == ACTIONMOINS)
{
ValeurMoins(code);
}
}

private
void ValeurPlus(
string baumuster6)
{

try
{

foreach (
RepeaterItem Item
in rptClasses.Items)
{

if (((
Label)Item.FindControl(
"lblCode")).Text.ToString() == code)
{

TextBoxtbValeur= (
TextBox)Item.FindControl(
"tbValeur");

if (tbValeur.Text !=
"")
{

if (IsDouble(tbValeur.Text))
{

Double valeur=
Convert.ToDouble(tbValeur.Text) + 0.5;
tbValeur.Text = valeur.ToString();
}
}
}
}
}

catch (
Exception ex)
{

Util.Log("ValeurPlus : "+ ex.Message);
}
}La fonction ValeurMoins est identique à ValeurPlus mais elle soustrait 0,5.
0
cs_rastali Messages postés 13 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 21 mars 2008
6 déc. 2007 à 10:41
Ah et j'ai oublié les messages d'erreur, donc lors de la compilation j'ai ces erreurs:

Le type 'Page1' contient déjà une définition pour 'tbValeur'
Le type 'Page1' contient déjà une définition pour 'btnPlus'  
Le type 'Page1' contient déjà une définition pour 'btnMoins' 
Le type 'ASP.page1_aspx' définit déjà un membre appelé '__BuildControltbValeur' avec les mêmes types de paramètres 
Le type 'ASP.page1_aspx' définit déjà un membre appelé '__DataBindingtbValeur' avec les mêmes types de paramètres 
Le type 'ASP.page1_aspx' définit déjà un membre appelé '__BuildControlbtnPlus' avec les mêmes types de paramètres 
Le type 'ASP.page1_aspx' définit déjà un membre appelé '__DataBindingbtnPlus' avec les mêmes types de paramètres 
Le type 'ASP.page1_aspx' définit déjà un membre appelé '__BuildControlbtnMoins' avec les mêmes types de paramètres  
Le type 'ASP.page1_aspx' définit déjà un membre appelé '__DataBindingbtnMoins' avec les mêmes types de paramètres 

Et si je retire le alternatinItemTemplate, j'ai ces messages d'erreurs:

'System.Web.UI.Control' ne contient pas de définition pour 'DataItem' 
'System.Web.UI.Control' ne contient pas de définition pour 'DataItem' 
'System.Web.UI.Control' ne contient pas de définition pour 'DataItem' 

correspondant aux lignes des elements contenus dans l'update panel, a savoir le textbox et les deux boutons.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
9 déc. 2007 à 19:53
Bonjour,

en mettant ton updatepanel autour de ton repeater, tu vas rafraichir tous le repeater et pas seulement un item. A mon avis le problème que tu as vient des id de tes controles, il semble que tu as des id dupliqués pour 2 textbox différentes.

J'ai déjà mis des updatepanels dans une itemtemplate de repeater et il n'y a pas de problème, il faut juste faire attention à bien reconstruire les items comme il faut si on le construit de facon peu orthodoxe ;-)

<hr />Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
Rejoignez-nous