48 votes

Meilleur moyen d'accéder à un contrôle sur un autre formulaire dans WinForms?

Tout d'abord, c'est une question à propos d'une application de bureau à l'aide de Windows Forms, pas un ASP.Net question.

J'ai besoin d'interagir avec les contrôles sur d'autres formes. En essayant d'accéder aux commandes en utilisant, par exemple, la suite...

otherForm.Controls["nameOfControl"].Visible = false;

...ne fonctionne pas de la façon dont je voudrais attendre. Je me retrouve avec une exception générée à partir de Main. Cependant, si je fais les contrôles public au lieu de private, je peux alors accéder directement à eux, comme si...

otherForm.nameOfControl.Visible = false;

Mais est-ce la meilleure façon de le faire? Est de rendre le contrôle public sur l'autre forme considérés comme des "meilleures pratiques"? Est-il un "meilleur" moyen de contrôles d'accès sur une autre forme?

Plus D'Explications:

C'est en fait une sorte de suite d'une autre question que j'avais posée: la Meilleure méthode pour la création d'un "arbre des préférences de la boîte de dialogue" type de l'interface en C#? La réponse que j'ai eu était grand et résolu de nombreux, de nombreux problèmes d'organisation j'ai eu en termes de maintien de la droite de l'INTERFACE utilisateur et facile à travailler à la fois dans le temps et au moment de la conception. Cependant, il a apporté cette tatillonne question de facilement contrôler d'autres aspects de l'interface.

En gros, j'ai une racine qui instancie beaucoup d'autres formes qui sont assis à une table ronde sur la racine. Ainsi, par exemple, un bouton radio sur l'un de ces sous-formulaires pourriez avoir besoin de modifier l'état d'une barre d'état icône sur l'essentiel, la forme de base. Dans ce cas, j'ai besoin d'un sous-formulaire à parler à la commande dans la barre d'état de la société mère (racine) de la forme. (J'espère qu'un sens, pas dans un "à qui la" sorte de façon.)

38voto

Jon Limjap Points 46429

Au lieu de rendre le contrôle public, vous pouvez créer une propriété contrôlant sa visibilité:

 public boolean ControlIsVisible
{
     get { return control.Visible; }
     set { control.Visible = value; }
}
 

Cela crée un accesseur approprié à ce contrôle qui n'exposera pas l'ensemble des propriétés du contrôle.

20voto

Rob Cooper Points 15945

Personnellement, je recommanderais de NE PAS le faire. Si cela répond à une action et qu’il doit changer d’apparence, je préférerais organiser un événement et le laisser se régler lui-même.

Ce genre de couplage entre les formes me rend toujours nerveux. J'essaie toujours de garder l'interface utilisateur aussi légère et indépendante que possible.

J'espère que cela vous aide, peut-être pourriez-vous développer le scénario sinon?

8voto

Biri Points 4992

La première ne fonctionne pas bien. Les contrôles sur un formulaire sont privée, visible uniquement pour la forme par la conception.

Pour rendre tout cela public est également pas la meilleure façon.

Si je tiens à exposer quelque chose du monde extérieur (qui peut aussi signifier une autre forme), je fais un public bien pour elle.

public Boolean nameOfControlVisible
{
    get { return this.nameOfControl.Visible; }
    set { this.nameOfControl.Visible = value; }
}

Vous pouvez utiliser cette propriété publique pour masquer ou afficher la commande ou de demander le contrôle de la visibilité actuelle de la propriété:

otherForm.nameOfControlVisible = true;

Vous pouvez également exposer tous les contrôles, mais je pense que c'est trop beaucoup, vous devez vous rendre visible uniquement les propriétés que vous voulez vraiment utiliser de l'extérieur de la forme actuelle.

public ControlType nameOfControlP
{
    get { return this.nameOfControl; }
    set { this.nameOfControl = value; }
}

5voto

Biri Points 4992

Après avoir lu les détails supplémentaires, je suis d’accord avec robcthegeek : déclencher un événement. Créez un EventArgs personnalisé et transmettez-lui les paramètres nécessaires.

3voto

KARAN Points 21

Supposons que vous avez deux formulaires et que vous souhaitez masquer la propriété d’un formulaire via un autre:

       form1 ob = new form1();
      ob.Show(this);
      this.Enabled= false;
 

et quand vous voulez avoir le focus de form1 via le bouton form2 alors:

       Form1 ob = new Form1();
      ob.Visible = true;
      this.Close();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X