2010-06-21 3 views
0

J'ai récemment commencé à me familiariser avec Visual Studio 2010 et C# pour un stage. C# n'inclut pas de fonction InputBox intégrée, j'ai donc créé mon propre formulaire, avec une zone de texte, deux boutons et une simple étiquette.Les propriétés de l'étiquette C# ne seront pas mises à jour lors du redimensionnement

J'ai une fonction configurée pour permettre au programmeur d'appeler le formulaire au format normal (où l'utilisateur saisit une entrée via la zone de texte) ou oui/non (où le formulaire affiche simplement une question et les boutons oui et non). Lorsque je passe au format oui/non, je veux centrer l'étiquette par programme. J'ai utilisé le code:

labelNote.Left = inputBox.Left + (inputBox.Width/2) - (labelNote.Width/2); 

Ceci devrait placer le centre de la note au centre du formulaire. Toutefois, si le contenu de l'étiquette est modifié (rendant la nouvelle étiquette plus longue ou plus courte), les propriétés ne sont pas mises à jour pour refléter la nouvelle taille. Il ne se centre pas à moins d'inclure le texte original. Y a-t-il un moyen de forcer une mise à jour? Je prévois que cela devienne un problème avec le positionnement des objets pour l'évolutivité dans le futur.

Merci pour votre temps

+1

Utilisez-vous WinForms, WPF ou ASP.NET? –

+0

Winforms, autant que je sache. Je suis assez nouveau à l'environnement et la langue cependant ... – KChaloux

Répondre

0

Il se trouve que j'ai fait une erreur stupide (un thème commun pour moi dans le débogage.) Le très petit truc passe inaperçu pendant le plus long laps de temps).

Le redimensionnement de l'étiquette n'a pas été le problème. Le problème était l'ordre dans lequel j'ai changé le contenu de l'étiquette, puis appelé la fonction pour calculer son nouvel emplacement. J'appelais le calcul de l'emplacement en premier, donc il a trouvé où centrer l'étiquette en fonction de l'ancien contenu. Je n'ai pas remarqué depuis si longtemps, parce que le texte changeait correctement. Je tenais pour acquis que les fonctions étaient appelées dans le bon ordre. Donc, en cas de doute, vérifiez l'ordre dans lequel vous écrivez votre code. Merci pour votre aide de toute façon, tout le monde. J'ai fini par trouver des choses intéressantes qui pourraient être applicables à d'autres scénarios (comme la fonction MeasureString dans la classe Graphics).

0

Je suppose que vous avez la taille dans un ActionListener. Plus précisément, l'écoute d'actions de redimensionnement des formulaires. Ensuite, chaque fois que le formulaire est redimensionné, il est appelé et tout le code est rappelé. Ensuite, pour forcer une mise à jour depuis un autre endroit, il suffit d'appeler l'actionlistener.

actionListener:

Private Sub formName_Resize(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Resize 

Appels actionListener:

formName_Resize(sender, e) 
+0

J'aime le regard de vos solutions, mais quelques questions persistent: L'action actionenerener l'événement faisant quelque chose de spécifique? C'est-à-dire, lorsqu'il est appelé, définit-il manuellement la taille de l'étiquette? – KChaloux

+0

Oui, il fait quelque chose de spécifique à l'intérieur. Là, vous pouvez définir manuellement la taille de l'étiquette. Quand je l'ai utilisé, j'ai défini la hauteur, la largeur et l'emplacement de chacune de mes étiquettes, champs, etc. dans ma fenêtre afin qu'ils puissent s'ajuster dynamiquement dans l'espace chaque fois que l'utilisateur changeait la forme de la fenêtre. Fondamentalement, mettez le code que vous avez qui change la taille, etc. de vos étiquettes, champs, etc. – Kyra

0

Eh bien, vous pouvez joindre un événement à Label.TextChanged. Franchement, il serait préférable de changer le TextAlign ou quelque chose comme ça: essayez d'effectuer la mise en page d'une manière déclarative au lieu de le faire explicitement par le biais du code. Cela a tendance à faire fonctionner les choses plutôt mieux. J'ai trouvé le contrôle [TableLayoutPanel] 1 assez facile à utiliser - la plupart du temps (et parfois une douleur complète).

Questions connexes