Je crée une application Winforms. Parce que je veux redessiner certaines bordures, je veux parcourir les contrôles et vérifier quels contrôles ont une bordure. Malheureusement, je ne sais pas comment y parvenir.
Je sais que les panneaux et les zones de texte, etc. ont une propriété BorderStyle mais je ne peux pas y accéder en parcourant les contrôles. J'utilise la fonction de ce lien: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.controls?view=netframework-4.8 , pour parcourir les contrôles. p>
3 Réponses :
Vous pouvez utiliser un foreach pour chaque type de contrôle que vous utilisez (TextBox, Label, etc.)
var controlsWithoutBorders = new List<Control>(); foreach (var control in controls) { var controlAsTextBox = control as TextBox; var controlAsLabel = control as Label; if (controlAsTextBox != null && controlAsTextBox.BorderStyle != BorderStyle.None) { controlsWithBorders.Add(control); } if (controlAsLabel != null && controlAsLabel.BorderStyle != BorderStyle.None) { controlsWithBorders.Add(control); } }
Vous pouvez également utiliser un seul foreach
sur tous les contrôles et essayez de convertir le contrôle en chaque type. Le cast réussira si le contrôle est réellement celui vers lequel vous voulez le caster, sinon il retournera null (par exemple en essayant de convertir un Control
qui est un TextBox
en un Label
renverra null
)
var controlsWithoutBorders = new List<Control>(); // Check textboxes foreach (var control in controls.OfType<TextBox>()) { if (control.BorderStyle != BorderStyle.None) { controlsWithoutBorders.Add(control); } } //Check labels foreach (var control in controls.OfType<Label>()) { if (control.BorderStyle != BorderStyle.None) { controlsWithoutBorders.Add(control); } }
Si vous avez un panneau, vous pouvez foreach sur le panneau. J'utilise le chargement de formulaire comme un événement
foreach (var item in this.Controls) { //Get item from form dynamic element = item; //check if there is any property called Borderstyle exists var res = item.GetType().GetProperties().Where(p => p.Name.Equals("BorderStyle")).FirstOrDefault(); //if it exists and value is not equal None(Control have border) if (res !=null && !(res.GetValue(item).Equals("None"))) { res.SetValue(item, BorderStyle.FixedSingle, null); //your other commands } }
Ou vous pouvez les vérifier dynamiques
Je vous recommande d'utiliser la méthode dynamique. p >
de cette façon, votre application ne rencontrerait pas d'exceptions ou d'erreurs
private void Form1_Load(object sender, EventArgs e) { foreach (var item in this.Controls) { switch (item.GetType().Name) { case "Label": if (((Label)item).BorderStyle == BorderStyle.None) { //Your commands } break; case "TextBox": if (((TextBox)item).BorderStyle == BorderStyle.None) { //Your commands } break; } } }
La méthode dynamique devrait fonctionner! L'idée de commutateur est quelque chose que je voudrais éviter car j'ai beaucoup de contrôles personnalisés, donc chaque fois que j'ajoute un nouveau contrôle, je devrais l'ajouter dans le commutateur.
@YLohrmnn Oui, je préfère personnellement une manière dynamique. switch c'est dans certains cas que vos commandes sont basées sur vos types de contrôle.
Bien que cette méthode ne soit pas la plus rapide au moment de l'exécution, votre problème pourrait être résolu proprement avec l'utilisation de la fonction de saisie dynamique de C #. Considérez l'extrait de code ci-dessous.
public void DealWithBorder(List<Control> lsControls) { foreach(var element in lsControls){ dynamic dynamicElement = element; try{ BorderStyle style = dynamicElement.BorderStyle; // Handle if property does exist in the control } catch{ // Handle if property doesnt exist in the control } } }
En anglais, il essaiera d'agir comme si la propriété existait dans l'objet, mais si ce n'est pas le cas, une exception sera levée. Pour plus d'informations sur la saisie dynamique, cliquez ici .
p>
@TaW Pouvez-vous expliquer pourquoi? (Si je devais deviner, ce serait les frais généraux impliqués)
Oui. Les exceptions coûtent cher et ne devraient attraper que l'inattendu.
Si vous ne parvenez pas à décider des types de contrôles dont vous disposez, vous pouvez utiliser la réflexion pour savoir s'ils ont un style de bordure.