7
votes

Passer des données à la première forme de la deuxième forme en C #

J'ai deux formes. Dites forma , formb .

de forma j'ai appelé formb en utilisant frmb.show ();

dans FAXB, j'ai deux textes de texte et une commande ComboBox. Supposez que l'utilisateur entre dans certaines données dans ces deux boîtes de texte et sélectionné un élément de Combobox dans Form2 et cliqué sur un bouton OK .

Après le clic, je souhaite que ces valeurs entrées par l'utilisateur de TextBoxes, la valeur de l'élément sélectionné ComboBox Retour à forma .

Comment puis-je atteindre cet utilisation en C #.


4 commentaires

Pouvez-vous vérifier vos tags? Est-ce vraiment une question spécifique C # -4? De plus, vos formulaires sont-ils des winforms? Merci


Oui. S'il y a une meilleure solution dans 4.0 c'est bien et bon à savoir.


Comment obtenir le contrôle (point d'exécution de l'exécution) du formulaire aux formulaires.


Avez-vous essayé d'ouvrir le formulaire à l'aide de Showdialog (). Vous avez ignoré cette réponse même après avoir été avancé. Il serait utile que vous puissiez fournir le raisonnement pour la raison pour laquelle cette solution - à votre avis - est insuffisante.


9 Réponses :


2
votes

Une solution sale, mais aussi la plus rapide est de rendre ces contrôles publics. Ceci que vous pouvez faire en ajoutant le mot public dans le fichier de form2.decisgner.cs. Si Forma a une variable de membre ou une variable locale de FAXB, vous pouvez accéder à la commande (Dites textebox1) avec: xxx

qui est maintenant accessible à l'extérieur de formulaire.


2 commentaires

ne pas avoir avec votre déclaration simple. S'il vous plaît dites-moi avec le code correctement.


Utilisez-vous des formulaires .NET C #? Chaque formulaire se compose d'au moins deux fichiers, supposons que votre formulaire soit défini dans les fichiers Formb.cs et FormB.Designer.cs. Et supposons que vos boîtes de texte soient appelées TextBox1 et Textbox2. Vérifiez à l'intérieur de votre fichier Formb.Designer.cs pour 'System Systemwindows.Forms.TextBox Textbox1;' ou analogique. Remplacez le travail «privé» avec «public». Maintenant, de partout où vous dites 'frmb.show ()', vous pouvez également dire 'frmb.textbox1.text', qui retournera le texte dans la zone de texte à ce moment-là. Par exemple, vous pouvez dire 'chaîne mytext = frmb.textbox1.text'.



0
votes

Si c'est sur la même page, vous devriez être capable de le lire directement à partir de vos commandes sous forme de textbox1.text, textbox2.text, comboBox.selectedValue (je suppose) Mais si c'est sur des pages différentes, utilisez des variables de session comme: Session ["Date1"] = textbox1.text; Session ["Date2"] = textbox2.text; Session ["Combalance"] = Combobox.selectedValue; et utilisez-les pour peupler votre formulaire


1 commentaires

Je travaille sur les applications Web complètes C # WinApps non ASP.NET. Puis-je utiliser des variables de session dans Windows?



2
votes

Que diriez-vous d'utiliser des événements et des délégués? Voir ce http://colinmackay.scot/2005/ 04/22 / Valeurs de passage - entre-formes-in-net /


0 commentaires

0
votes

Cela dépendrait de la façon dont vous concevez normalement vos applications.

  • vous pouvez travailler en utilisant un événement Système piloté où vous créeriez événements et délégués. Mentionné par @ Dave81
  • ou vous pouvez créer des propriétés qui renvoyer les valeurs données / sélectionnées afin que le parent peut les récupérer de l'objet (voulait dire dialogue mais pas sûr de votre utilisation).
  • ou vous pouvez suivre @zmilojko et juste les mettre public, qui est fondamentalement la même chose que la création de propriétés mais plus au côté obscur du codage Pratiques: D

    Tout cela fonctionnerait mais tout dépend de la structure de vos applications.


0 commentaires

5
votes

Dans le scénario que vous décrivez, j'appellerais probablement frmb.showdialog () plutôt que frmb.show () . xxx

Les avantages de showdialog () sont-ils:

  1. Obtenez la valeur de retour dans le formulaire vous permettant de déterminer que OK (plutôt que d'annuler) a été cliqué pour la fermer.
  2. Le formulaire n'est pas immédiatement disposé lorsqu'il est fermé, vous permettant ainsi de récupérer les valeurs que vous souhaitez.
  3. En ouvrant FRMB comme boîte de dialogue modale, vous évitez de devoir vérifier les complexités pouvant survenir si votre utilisateur commence à interagir avec le forma tandis que FRMB est ouvert.

    Remarque: lors de la conception de FRMB, vous devez définir la propriété dialogruresult de la commande de bouton OK sur dialogresult.ok pour que le formulaire revienne La boîte de dialogue correcte lorsque ce bouton est enfoncé (vous pouvez également définir this.dialogresult dans le gestionnaire d'événements du bouton OK)


2 commentaires

@sukumar: Avez-vous essayé cette solution ou n'est-il pas approprié d'avoir ouvert FRMB comme boîte de dialogue?


@sukumar: Lorsque vous appelez frnb.showdialog (), le thread de forma ne passe pas immédiatement à l'énoncé suivant, mais attend que le FRMB revient avec une dialogue.



4
votes

ou vous pouvez transmettre un objet de forma à former et lier ses propriétés aux commandes de Formb. Si vous souhaitez que Forma soit notifié lorsque vous cliquez sur le bouton OK, vous pouvez déclarer un événement dans votre classe de conteneur de données, vous abonner à la forma et le tirer à partir de forma.

Soyez datacontainer une classe que vous définissez P>

public DataContainer Data { get; set; }

private void Form2_Load(object sender, EventArgs e)
{
    textBox1.DataBindings.Add(new Binding("Text", Data, "Text1"));
    textBox2.DataBindings.Add(new Binding("Text", Data, "Text2"));
}

private void button1_Click(object sender, EventArgs e)
{
    Data.AcceptChanges();
}


2 commentaires

Semble un code plus complexe. J'ai besoin d'un code simple pour gérer l'exigence


@sukumar: essayez showdialog () :-)



4
votes

Vous pouvez créer un événementHandler sur FORMB que forma s'abonnera à. En outre, ajoutez quelques propriétés publiques à FAIPB qui représentent que les données que vous souhaitez que forma puissent utiliser. Ensuite, lorsque FORMB incendie l'événement, le forma saura rafraîchir ses données.

Remarque: Le principe clé dans cet exemple est en train de mettre en place un événementHandler (vous pouvez créer votre propre type de gestionnaire d'événements) qui notifie forma lorsque les données sont prêtes à être rafraîchi / vu / etc. Espérons que cet exemple vous permettra de voir comment vous pouvez implémenter un gestionnaire d'événements pour votre situation particulière. P>

exemple: p>

forma - p>

public partial class FormB : Form
{
    //Event that fires when data is available
    public event EventHandler OnDataAvailable;

    //Properties that expose FormB's data
    public string Text1 { get; private set; }
    public string Text2 { get; private set; }

    public FormB()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Set the exposed properties, then fire off the event.
        this.Text1 = this.textBox1.Text;
        this.Text2 = this.textBox2.Text;

        if (OnDataAvailable != null)
            OnDataAvailable(this, EventArgs.Empty);
    }
}


1 commentaires

Merci JED, exemple agréable et propre.



6
votes

J'ai approché le moyen simple. Petits embellissements ..

  1. Créer des variables publiques dans votre classe de formulaire I.E. P>

    String Publics PassVariable1 = ""; p> blockQuote> li>

  2. Si vous avez des boîtes de texte, accédez à des propriétés, cliquez sur le boulon de foudre et double-cliquez sur l'événement Evénement Textchanged vide. Cela créera un extrait de code dans le code Begind qui est exécuté lorsque le contenu de la zone de texte a changé. Dans ce bloc de code attribue le contenu de la zone de texte à votre variable publique correspondante. P> LI>

  3. I.e. ma variable publique était p>

    problème de chaîne publique = ""; p>

    vide privé TXTISTISUE_TEXTCHANGED (expéditeur d'objet, evenargs e) { numéro = txtuse.text; } p> blockQuote> li>

  4. Ajoutez un bouton et créez un événement de clic pour ce bouton (double-cliquez simplement sur le bouton du volet de conception). Dans le bloc d'événement de clic, définissez le résultat du dilogue sur OK et cachez le P>

    this.dialogresult = dialogresult.ok; p>

    this.hide (); p> blockQuote> li>

  5. Dans le code de fenêtre parent Vérifiez sur le résultat de la boîte de dialogue et saisissez les données de formulaire des variables publiques de la forme enfant p> li> ol>

    if (f.ShowDialog() == DialogResult.OK)
      {
          string b  = f.issue;             
          string e = f.year;
          string f = f.month;
      };
    


0 commentaires

1
votes

J'avais le même problème et j'ai eu une idée qui est un peu différente. Dans mon scénario, je fais un programme FlashCard pour mes deux plus jeunes enfants et je voulais pouvoir reporter la réponse fournie à la forme parent (nouveau formulaire enfant pour chaque nouvelle question FlashCard afin que le formulaire parent puisse mettre à jour le nombre de GAUCHE, combien de corrects, combien d'erreurs, etc.) sans avoir à ajouter des valeurs à une base de données. Semble être surchargé pour quelque chose qui devrait être simple. Ce que j'ai fait était de créer une classe avec 3 de chaque type de variable. Je pensais que trois de chaque type seraient suffisants pour la plupart des travaux.

Ceci est un exemple de ma nouvelle classe: p> xxx pré>

i Créez une nouvelle valeur de valeur (Ville titulaire VH;) de la forme parent et transmettez-la à la forme de l'enfant. Dans le formulaire enfant, je crée une nouvelle porte-valeurs, puis définissez-la égale à l'objet titulaire de la valeur envoyé dans le constructeur de classe de la forme enfant. Maintenant, lorsque la touche Entrée est enfoncée (réponse donnée), je peux définir VH.IntValue1 égal à ceci.Swerbox.text; ... Eh bien, je dois utiliser Int.tryparse (); Mais vous avez l'idée. Je n'ai alors besoin que de référencer VH.IntValue1 à partir du formulaire parent pour obtenir la valeur saisie. P>

Formulaire parent: P>

ValueHolder vh;

public ChildClass (ValueHolder vhIncoming)
{
  vh = vhIncoming;
}

private void answerBox_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
    vh.intValue1 = 1234;
  }
}


0 commentaires