Bonjour,

Je débute sur .Net et je ne suis pas encore très au fait des bonnes pratiques.
Mon projet est un peu complexe pour pouvoir poster du code.

Je requête un système SAP et j'affiche mes données dans une listview qui permet aux utilisateurs des modifier des données que je renvoie vers SAP.


Les controls de mon itemtemplate qui semble poser problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
<asp:ImageButton  ID="bouton_plus" runat="server" 
                  AlternateText="Ajouter" 
                  Height="15px" 
                  ImageUrl="~/img/plus.png" 
                  OnClick="click_plus" 
                  TabIndex="<%# Container.DataItemIndex %>" 
                  Width="15px" />
 
 
<asp:TextBox  ID="zqtcmd" runat="server"  
              AutoPostBack="True" 
              causevalidation="true"
              ControlStyle-Width="80px" 
              Style="text-align:right" 
              TabIndex="<%# Container.DataItemIndex %>" 
              OnTextChanged="saisi_quantite" 
              Text='<%# Convert.ToInt32(Eval("zqtcmd")) %>'>
</asp:TextBox> 
<asp:MaskedEditExtender ID="MaskedEditExtender1" 
                        runat="server" 
                        TargetControlID="zqtcmd" 
                        Mask="999999999" 
                        PromptCharacter="" 
                        ClearTextOnInvalid="true">
</asp:MaskedEditExtender>
le code serveur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
protected void click_plus(object sender, EventArgs e)
{
    // Récupération de la ligne selectionnée
    ImageButton buttonclick = (ImageButton)sender;
    int rownumber = buttonclick.TabIndex;
    // Mise à jour des données sauvegardées dans la session 
    DataTable dt = (DataTable)(Session["dt_data"]);
    DataRow row = dt.Rows[rownumber];
    //row.BeginEdit();
    // ajoute increment
    row[11] = (Convert.ToInt32(row[11]) + Convert.ToInt32(row[4])).ToString();
    //row.EndEdit();
    // mise à jour de la listview
    bindListView();
}
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
protected void saisi_quantite(object sender, EventArgs e)
{
    // Récupération quantité saisie
    TextBox inputModif = (TextBox)sender;
    int rownumber = inputModif.TabIndex;
 
    // Mise à jour des données sauvegardées dans la session 
    DataTable dt = (DataTable)(Session["dt_reappro_client"]);
    DataRow row = dt.Rows[rownumber];
    // CONTROLE SAISI 
    float reste = Convert.ToInt32(inputModif.Text) % Convert.ToInt32(row[4]);
    if (reste == 0)
    {
        //row.BeginEdit();
        row[11] = inputModif.Text.ToString();
        //row.EndEdit();
    }
    else
    {
        //inputModif.Text = "0";
        //row.BeginEdit();
        row[11] = "0";
       // row.EndEdit();
    }
    // mise à jour de la listview
    bindListView();
}

A première vu tout fonctionne, mais lorsque l'on se sert des boutons retour et refresh du navigateur les modifications apportées en saisie ou par le click sur le bouton plus ne sont pas sauvegardées. Je me retrouve avec ma zone de saisie à 0. Et cela uniquement pour le premier item de ma listview. Pour les items suivants tout fonctionne correctement. Si je suis le processus de validation des données, la page suivante reçoit bien les données à jours modifiées par mes deux fonctions click_plus et saisi_quantite.

En debug je me suis rendu compte que la methode saisi_quantite était systématiquement appelé deux fois. Qu'est qui généré ce double appel ? Le fait d'être en debug ?

Pouvez-vous me donner une piste, je galère sur ce problème depuis ce matin et là je craque !
Si vous avez des remarques à faire sur la technique de codage elles seront également les bienvenues.

Merci d'avance pour votre aide !

Stéphane