Comment accéder à un contrôle de formulaire pour une autre forme?
J'ai deux Form
classes, dont l'une a un ListBox
. J'ai besoin d'une définition pour la SelectedIndex
propriété de la ListBox
, qui, je tiens à appeler à partir de la deuxième Form
.
Pour le moment, je suis en train de faire les suivants:
Forme 1
public int MyListBoxSelectedIndex
{
set { lsbMyList.SelectedIndex = value; }
}
Forme 2
private ControlForm mainForm; //form 1
public AddNewObjForm()
{
InitializeComponent();
mainForm = new ControlForm();
}
public void SomeMethod()
{
mainForm.MyListBoxSelectedIndex = -1;
}
Est-ce la meilleure façon de le faire?
OriginalL'auteur wulfgarpro | 2011-01-27
Vous devez vous connecter pour publier un commentaire.
J'ai l'habitude d'utiliser le Modèle de Conception Singleton pour quelque chose comme ça http://en.wikipedia.org/wiki/Singleton_pattern . Je vais faire la forme principale que l'application est en cours d'exécution en vertu de l'singleton, et ensuite créer des accesseurs pour les formulaires et les contrôles que je souhaite aborder dans d'autres domaines. Les autres formes peuvent ensuite obtenir un pointeur vers le contrôle qu'ils veulent modifier, ou les données dans la partie principale de l'application qu'il souhaite modifier.
Une autre approche est de mettre en place des événements sur les différentes formes de communication, et d'utiliser le formulaire principal comme une plaque tournante de toutes sortes de transmettre les messages d'événement à partir d'une forme à une autre au sein de l'application.
Swangren - C'est pourquoi j'ai suggéré. C'est totalement une option, mais cela demande beaucoup plus de temps pour faire de chaque événement que vous souhaitez ajouter de nouveaux crochets, tandis que d'un singleton est assez bien une chose. Mon préféré chose à faire est de l'abstraction de l'INTERFACE utilisateur de la base du comportement de l'application. Ce noyau est alors le singleton, et peut avoir des événements attaché à elle. Ensuite, toute l'INTERFACE utilisateur est juste un affichage des données dans la base. Cela fait de faire annuler/refaire des comportements beaucoup plus facile.
Je ne vois aucune exigence pour annuler-rétablir le comportement, et je suis en désaccord avec votre affirmation qui implique que paramétrer des événements est une lourde tâche. Les Singletons sont souvent une merde solution à tout problème. J'allais faire la liste des arguments à l'appui, peu, j'ai trouvé une très bonne liste ici: blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx
OriginalL'auteur ColinCren
Rendant Singleton n'est pas entièrement une mauvaise idée, mais personnellement, je préfère pas le faire de cette façon. Je préfère passer la référence de l'un à l'autre forme. Voici un exemple.
Form1 déclenche Form2 pour l'ouvrir. Form2 a surchargé constructeur qui prend en appelant le formulaire comme argument et fournit sa référence à la Form2 membres. Cela résout le problème de communication. Pour exemple, j'ai exposé l'Étiquette de la Propriété publique dans Form1, qui est modifiée dans Form2.
Avec cette approche, vous pouvez faire de la communication de différentes manières.
Lien de téléchargement pour le Projet de l'Échantillon
//Votre Form1
//Votre Form2
le texte d'alt http://demo.ruchitsurati.net/files/frm1.png
le texte d'alt http://demo.ruchitsurati.net/files/frm2.png
Êtes-vous vraiment downrating une solution parce que vous ne pensez pas que c'est la meilleure solution? J'espère pas parce que c'est totalement valide et la solution de travail.
Alors, oui, la solution est valide, je ne crois pas qu'il est optimal: je ne recommande pas le passage d'un Formulaire à rien d'autre qu'un présentateur. Si vous n'êtes pas à l'aide de présentateurs, puis utiliser une autre classe pour y passer des délégués ou de passer des délégués à l'autre forme. N'ouvrez pas une forme jusqu'à l'abus par un autre.
d'accord avec Tipx vers le bas de votes sont incorrectes ou missleading réponse, si vous pensez qu'il est une meilleure réponse, puis upvote il (ou fournis si vous ne le voyez pas), ne pas punir les gens pour les aider
La meilleure solution serait de passer une sauvegarde de classe, plutôt que la forme elle-même car cela vous permet de partager les fonctionnalités requises, vous pouvez également mettre en œuvre des événements de notification. il est aussi mieux s'adapte à la Liaison de modèle
OriginalL'auteur this. __curious_geek
Accès les contrôles du formulaire, comme ceci:
formname.controls[Index]
.Vous pouvez lancer que le contrôle approprié de type, par Exemple:
DataGridView dgv = (DataGridView) formname.Controls[Index];
OriginalL'auteur Dwight
Il y a une façon de plus, dans le cas où vous ne voulez pas faire une boucle par "TOUS" les commandes comme Joe Dabones suggéré.
Faire une fonction dans Form2 et de l'appeler à partir de Form1.
OriginalL'auteur
Il est facile, d'abord, vous pouvez accéder à l'autre formulaire comme ceci:
(disons que votre autre forme est
Form2
)Ça y est, vous venez d'écrire dans
TextBox1
dansForm2
deForm1
.OriginalL'auteur Joe Dabones