1
votes

Vérifiez quels contrôles ont des bordures c #

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.


1 commentaires

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.


3 Réponses :


0
votes

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);
    }
}


0 commentaires

3
votes

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;
            }
        }
    }


2 commentaires

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.



0
votes

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>


2 commentaires

@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.