Signaler

Utilisateur bloqué sur un textbox vide [Résolu]

Posez votre question Pruno57 - Dernière réponse le 12 août 2017 à 01:08 par Whismeril
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
Utile
+2
plus moins
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
        }
    }




Cette réponse vous a-t-elle aidé ?  
Pruno57 3Messages postés jeudi 10 août 2017Date d'inscription 11 août 2017 Dernière intervention - 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 ^^
Répondre
Whismeril 10156Messages postés mardi 11 mars 2003Date d'inscription ContributeurStatut 21 octobre 2017 Dernière intervention - 12 août 2017 à 01:08
De rien
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !