Utilisateur bloqué sur un textbox vide

Résolu/Fermé
Pruno57 - 10 août 2017 à 18:48
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 12 août 2017 à 01:08
Bonjour,
Voilà 4h que je cherche une réponse sur le net et par moi même mais en vain ... pourtant je suis sûr que la solution est toute bête

Contexte :

J'ai une Base de donnée qui donne liste de référence de produit et leurs attribut (N°Réf, Libellé Produit, Tarif, Unité du tarif (pièce, kg...), Dimensions (Lxlxh), Conditionnement (nombre de pièces par colis, nombre de pièces par barquette, nombre de barquette par colis), Code EAN, ...)

Certains de ces attributs sont obligatoires (comme par exemple N°Ref et Libellé) contrairement à d'autres

J'autorise donc la valeur DBNull pour ces derniers.

Seulement, dans certains cas, il est même impératif que des attributs soient null

Dans le cas par exemple d'un produit vendu à la "barquette", je veux que le nombre de pièces par colis soit null

Lors de la création de la base de données, aucun soucis, tout fonctionne parfaitement... jusqu'aux essais utilisateurs... lorsqu'il veut changer un article vendu à la pièce en article vendu à la barquette, il change la valeur d'un combobox pour l'unité du tarif puis il doit "effacer" la valeur dans le champ textbox correspondant à "nombre de pièce par colis" mais il reste coincé dans la textbox sans autre moyen d'en sortir que d'y remettre une valeur :(

Mes essais :

J'ai essayé de changé la propriété causevalidation à "false", il sort bien du textbox mais là c'est à l'enregistrement que le problème se pose : la valeur initiale reste dans la base de donnée...

J'ai ensuite essayé de gérer l’événement combobox.textchanged, ou validated
private void comboBox4_Validated(object sender, EventArgs e)
{
        // Vérifie si l'unité tarif est barquette ou sachet
        if (C.ContainsIC(comboBox4.Text, "barq", "sac"))
        {
            nbrePceColisTextBox.text = null;
            nbrePceColisTextBox.ReadOnly = true;
        }
        else
            nbrePceColisTextBox.ReadOnly = false;
}


Pour le même résultat, à savoir qu'à l'enregistrement, la valeur initiale revient et cela même si le textbox est bien devenu null à l'écran.

Au final j'ai créer un bouton pour enregistrer directement dans la base de donnée la valeur null comme ceci :

private void button4_Click(object sender, EventArgs e)
{
    int n = refProdBindingSource.Position;
    BDDDataSet.RefProdRow RPR = BDDDataSet.RefProd.FindByRef(Convert.ToInt32(refTextBox.Text));
    RPR["NbrePceColis"] = DBNull.Value;
    refProdTableAdapter.Update(BDDDataSet.RefProd);
    refProdTableAdapter.Fill(BDDDataSet.RefProd);
    refProdBindingSource.Position = n;
}

ce qui fonctionne parfaitement mais n'est pas très pratique, alors j'ai essayé de fusionner les 2 idées en rajoutant ce code dans l’événement du combobox mais là c'est la valeur du combobox qui revient à sa valeur initiale (même en ayant rajouter RPR["UTarif"]=combobox4.Text;)

Je pourrais me contenter du bouton, mais je pense qu'il doit y avoir beaucoup plus simple pour transformer la valeur string.Empty d'un textbox en null (ou DBNull.Value) ... mais je ne la connais pas, c'est là que j'ai besoin de votre aide...

Merci d'avance
A voir également:

1 réponse

Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
10 août 2017 à 23:34
Bonsoir

je vois que tu utilises un BindingSource.
Comment l'as tu configuré?

Les bases de données c'est pas trop mon rayon, mais je sais bien me servir d'un bindingSource avec des collections.
Si selon ta config NbrePceColis est un entier, binding ne validera pas la chaine vide.
Il faut que tu lui fasses comprendre que NbreColis est un int?.

Je ne sais pas si c'est possible directement en prenant le TableAdapter comme DataSource de ton BindingSource.

Mais en passant par une classe intermédiaire (une sorte de wrappeur), ça doit le faire:

    class TestPruno
    {
        private int laRef;

        public int Ref
        {
            get { return laRef; }
            set 
            { 
                laRef = value;
                MajDB();
            }
        }
        

        private string ean;

        public string Ean
        {
            get { return ean; }
            set 
            {
                ean = value;
                MajDB();
            }
        }

        private int? nbreColis;

        public int? NbreColis
        {
            get { return nbreColis; }
            set 
            { 
                nbreColis = value;//là normalement si le textbox est vide value vaut null
                MajDB();
            }
        }
        
        private void MajDB()
        {
            //ici le code qui va bien pour mettre à jour cette instance
        }
    }




0
Pruno57 Messages postés 3 Date d'inscription jeudi 10 août 2017 Statut Membre Dernière intervention 11 août 2017
Modifié le 11 août 2017 à 18:50
Bonjour,
Tu as bien cerné le problème, la valeur string.empty n'est pas la valeur null
Pour un champ typé int ça pose problème
Je n'ai pas utilisé ta solution mais une bien plus simple qui consiste à dire que pour les textbox, string.empty = null
voici le code utilisé :

foreach (Control c in this.panel1.Controls)
if (c is TextBox)
c.DataBindings["Text"].NullValue = "";

Merci qd même ^^
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
12 août 2017 à 01:08
De rien
0