1
votes

Comment passer une valeur entière de 5 zones de texte différentes à 2 zones de texte différentes

J'ai une application Winforms qui a plusieurs boutons. Il oblige l'utilisateur à cliquer sur un bouton, quel que soit le nombre de fois dont il a besoin, cet événement de clic button1 ajoute ensuite une valeur entière à l'intérieur de textbox1, cette valeur entière augmente à chaque clic de button1. Et puis j'ai button2 qui, lorsqu'on clique dessus, il soustrait de la valeur entière dans textbox1.

Maintenant j'ai aussi textbox2, textbox3, textbox4, textbox5 et textbox6 faisant la même chose chacun avec leur propre paire de boutons à ajouter et soustraire. ils fonctionnent tous indépendamment les uns des autres. Txtbox1,2,3,4,5,6 sont les expéditeurs.

Mon problème survient lorsque je tente de faire passer la valeur entière dans txtbox1, txtbox2, txtbox3, txtbox4, txtbox5 et txtbox6 sur txtbox7 et txtbox8, qui sont les txtbox de réception. Chacune de ces txtboxes a également deux boutons qui ajoutent des valeurs et soustraient des valeurs. Je suis capable d'obtenir les valeurs de transmission de txtbox1 sur txtbox7 et txtbox8 sans problème. Le problème commence lorsque j'utilise le même code pour que toutes les autres txtboxes transmettent la valeur int à txtbox7 et txtbox8, l'entrée de l'une des 6 txtboxes se remplacera l'une l'autre.

par exemple Si je clique 5 fois sur txtbox1, il passe l'int 5 sur txtbox1, txtbox7 & txtbox8, mais si ensuite je vais et clique 2 fois sur txtbox2 alors txtbox7 & 8 la valeur de 5 n'est pas partie et il montre la nouvelle valeur de 2 à la place . Ce que je veux, c'est que lorsque l'un de ces boutons est cliqué, la valeur qui passe aux 2 txtbox de réception doit être ajoutée à la valeur int qui était déjà là. Je ne sais pas si c'est suffisamment explicatif. Ceci est mon code.

private void button1Add_Click(object sender, EventArgs e)
{
  AddToTexBox1(1);
}

private void AddToTextBox1(int changeBy)
{
  if (int.TryParse(txtBox1.Text, out int value))
  {
     value += changeBy;
     txtBox1.Text = value.ToString();
     txtBox7.Text = value.ToString();
     txtBox8.Text = value.ToString();
  }
  else
  {
     MessageBox.Show("Invalid Integer in TextBox!");
  }

}

private void Btn2Subtract_Click(object sender, EventArgs e)
{
     AddToTextBox1(-1);
}

Ce code fonctionne bien pour txtBox 1 et txtBox7 & txtBox8 mais quand j'essaye d'utiliser la même chose pour les autres txtBoxes, cela ne fonctionne pas comme attendu. Toute aide serait grandement appréciée.


0 commentaires

3 Réponses :


1
votes

Votre problème actuel est que vous opérez directement sur les valeurs stockées dans les zones de texte. Donc quand vous faites:

var myModel = new MyModel();
myModel.MyFirstInputValue = 1; // parse value from input textBox1
myModel.MySecondInputValue = 2; // parse value from input textBox2
myModel.RunMyCalculationLogic();
// TODO: use results from MyFirstResultValue and MySecondResultValue to populate textBoxes you need

Vous ne vérifiez pas la valeur actuellement stockée dans txtBox7.

Vous pouvez donc suivre 2 chemins pour résoudre il:

  1. Utilisez la même analyse pour int pour obtenir la valeur de votre txtBox7 et la mettre dans une variable, puis ajouter de la valeur à cette variable et seulement la sauvegarder dans la zone de texte cible.

  2. / p>
  3. Vous pourriez avoir un modèle derrière votre logique (au cas où ces nombres représenteraient quelque chose) et mettre à jour le modèle (en mettant des nombres dans les propriétés du modèle selon vos règles "métier"). Après cela, vous synchronisez votre interface utilisateur (TextBoxes) avec le modèle en plaçant les valeurs du modèle dans TextBoxes. Idéalement, vous aimeriez utiliser la liaison de données pour cela (pour que votre interface utilisateur soit actualisée automatiquement après les modifications de votre modèle).

Voici l'exemple de code pour 1.:

class MyModel
{
  public int MyFirstInputValue {get; set;}
  public int MySecondInputValue {get; set;}

  public int MyFirstResultValue {get; private set;}
  public int MySecondResultValue {get; private set;}

  public void RunMyCalculationLogic()
  {
    // your calculations go here...
    MyFirstResultValue = MyFirstInputValue + MySecondInputValue;
    MySecondResultValue = MyFirstInputValue - MySecondInputValue;
  }
}

Si vous avez besoin de plus d'informations concernant la liaison de données, veuillez consulter la documentation . Vous devrez passer du temps à apprendre et à vous habituer à cette approche, mais cela vous permettra de découpler la logique de votre modèle de l'interface utilisateur, ce qui est bénéfique pour les modèles et les interfaces utilisateur complexes.

Voici l'exemple de ce que je voulais dire en introduisant une classe distincte pour vos règles d'entreprise:

if (int.TryParse(txtBox1.Text, out int value) &&
    int.TryParse(txtBox7.Text, out int oldValue7) &&
    int.TryParse(txtBox7.Text, out int oldValue8)
    )
{
    value += changeBy;
    oldValue7 += value;
    oldValue8 += value;
    txtBox1.Text = value.ToString();
    txtBox7.Text = oldValue7.ToString();
    txtBox8.Text = oldValue8.ToString();
}

Ensuite, vous utilisez ce modèle plus ou moins comme ceci:

txtBox7.Text = value.ToString();


8 commentaires

Stas Ivanov J'ai essayé votre code mais cela fait que txtbox7 & 8 affiche des nombres qui sont ajoutés par 5, 6 ou 9 fois plus que ce qui apparaît sur txtbox1. En d'autres termes, je clique deux fois sur le bouton de txtbox1 et la valeur qui doit être transmise aux txtboxes 7 & 8 doit être 2, au lieu de cela, elle affiche la valeur de 6.


@Yorelis, la logique que vous souhaitez mettre en œuvre ne m'est pas tout à fait claire. Pourriez-vous décrire les règles brièvement mais précisément dans votre question? Une autre chose que vous pourriez faire est de jouer avec mon code et de voir si vous pouvez le faire fonctionner. Cela vous donne actuellement un nouveau comportement, non?


Stas Ivanov Ce que je veux, c'est que la valeur entrée dans chacune de ces zones de texte soit transmise à 2 autres zones de texte.Dans ce cas, ces zones seront txtBox7 et txtBox8 dont elles ont besoin pour avoir les valeurs de ces autres zones de texte. Donc si j'entre la valeur de 5 dans txtbox1 alors j'entre la valeur de 4 dans txtbox2 puis j'entre la valeur de 2 dans txtbox3 et je la valeur de 1 dans txtbox4 et la valeur de 2 dans txtbox5 et la valeur de 3 dans txtbox6 le résultat sera que txtbox7 et txtbox8 devraient afficher une valeur de 17 mais txtbox7 & 8


Voulez-vous en calculer la somme? Alors qu'est-ce que cela a à voir avec "ajouter et soustraire"?


Kyle Wang Oui, j'ai besoin que les valeurs transmises à textbox7 & 8 à partir des txtboxes 1,2,3,4,5,6 soient calculées. J'ai besoin des 6 zones de texte pour transmettre leurs valeurs numériques individuellement aux zones de texte 7 et 8 et pour calculer ces valeurs, mais si l'utilisateur a besoin de soustraire l'une de ces valeurs pour pouvoir le faire également. avec mon code, j'ai réussi à faire en sorte que txtbox1 fasse exactement cela. Mais je ne peux pas faire en sorte que les autres txtboxes 7 et 8 continuent à calculer les valeurs passées de toutes les autres txtboxes, une fois que j'entre une valeur dans l'une des autres txtboxes, les valeurs dans txtbox 7 et 8 sont écrasées.


@Yorelis c'est pourquoi l'OMI, il est préférable d'encapsuler cette logique dans une classe distincte et de ne synchroniser qu'avec les champs de cette classe dans la couche d'interface utilisateur (aka les liaisons du pauvre).


Stas Ivanov J'ai essayé votre code et cela entraînera un comportement différent de ce que je veux. Il provoque le calcul des valeurs entrées dans les txtbox de l'expéditeur 3 et 4 fois plus et affiche des nombres incorrects sur les txtbox de réception. Je ne sais pas comment faire fonctionner votre code, je suis plutôt novice en c #


@Yorelis J'ai ajouté un autre exemple à ma réponse. On dirait que je l'ai fait trop tard, mais cela pourrait quand même être utile.



1
votes

Votre vie serait beaucoup plus facile si vous utilisiez les contrôles NumericUpDown au lieu des zones de texte. Vous pouvez définir tous vos NUD sur la valeur par défaut 0, écrire un gestionnaire d'événement de modification de valeur pour eux (lier tous les événements de modification de valeur de NUD au même gestionnaire) qui a une seule ligne de code:

nud7.Value = myNuds.Sum(n => n.Value);

Si vous deviez mettre nud1 à nud6 dans un large tableau de classe dans le constructeur, vous pourriez même utiliser LINQ pour simplifier cela en:

nud7.Value = nud1.Value + nud2.Value + nud3.Value ...

Voici une étape par étape, faites-le dans un nouveau projet. Cela devrait prendre environ 10 minutes:

  • créer une nouvelle application Windows Forms
  • déposer 8 chiffres vers le bas sur le formulaire
  • sélectionnez-les tous, définissez leur valeur minimale et leur valeur sur 0, définissez la valeur maximale sur quelque chose de pertinent
  • sélectionnez les 6 premiers uniquement
  • allez dans la grille des propriétés, cliquez sur l'éclair, trouvez l'événement qui se rapporte à la valeur modifiée (probablement appelé ValueChanged, je ne suis pas sur un pc à tester en ce moment) et écrivez «AllChanged» dans la case à côté , appuyez sur retour
  • La vue du code
  • apparaît. Mettez ce premier code que j'ai posté (celui pour ajouter toutes les valeurs et stocker le résultat dans la valeur de 7 de mise à jour numérique) dans le gestionnaire d'événements
  • exécuter le projet

Je ne sais pas pourquoi vous avez deux boîtes de totaux ... mais je suis sûr que vous pouvez régler cela

Faites attention de ne pas ajouter le même gestionnaire d'événements à la boîte 7; vous provoquerez une boucle infinie qui débordera la pile


3 commentaires

Caius Jard Je l'ai eu avec des commandes numériques ascendantes, puis je l'ai changé, maintenant je n'ai tout simplement pas assez de temps pour le changer. Je dois présenter ce projet lundi. Je voulais juste avoir cette fonctionnalité afin qu'il soit plus facile pour les utilisateurs de saisir les données sans oublier d'ajouter ces valeurs. Merci


Allez; cela prendra environ 5 minutes pour échanger les zones de texte pour nud. Nud a déjà des boutons cliquables pour incrémenter et décrémenter afin d'économiser une charge de travail. Donnez aux nuds les mêmes noms que le tb qu'ils remplacent puis corrigez toutes les erreurs du compilateur comme "nunericupdown n'a pas de propriété x" .. puis renommez les nuds si vous le souhaitez et tout le code sera mis à jour. Prenez une copie de votre code avant de commencer. Si vous ne pouvez pas obtenir ce que j'ai conseillé de travailler dans trente minutes, mettez-le


(Comprenant que le temps presse ici, j'ai fait une modification pour que vous puissiez mettre en œuvre étape par étape ma recommandation sous forme de démo rapide)



0
votes

Après avoir joué avec du code que j'avais utilisé dans un autre projet Winforms que j'avais. J'ai trouvé la solution à mon problème. C'est ce que j'ai fait.

       TextBox[] txtbox;


        public FormOne()
        {
            InitializeComponent();



            Sqlconn con = new Sqlconn();

            txtbox = new TextBox[] { txtBox1, txtBox2, txtBox3, txtBox4, txtBox5, txtBox6, txtBox7};

            foreach (TextBox text in txtbox)
                text.TextChanged += new EventHandler(txtbox_TextChanged);

           }

           private void txtbox_TextChanged(object sender, EventArgs e)
        {
            int value = 0;
            int total = 0;
            foreach (TextBox text in txtbox)
            {
                if (int.TryParse(text.Text, out value))
                    total += value;
            }
            txtBox7.Text = total.ToString();
            txtBox8.Text = total.ToString();

            private void FormOne_Load(object sender, EventArgs e)
            {

            }

Merci à tous pour votre soutien.


0 commentaires