Gérer les checkbox et le "connecter"

Signaler
Messages postés
27
Date d'inscription
lundi 30 octobre 2017
Statut
Membre
Dernière intervention
4 août 2020
-
Messages postés
14570
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 août 2020
-
Bonjour,

Ça fait un moment que je n'avais pas mis les pied dans le C# du coup je bloque sur un élément de base qui ne me revient pas et mes recherches sur le web n'ont rien donné de concluant. Je compte donc sur votre aide =)

Voila, j'ai une checkBox1 qui si elle est décoché je veux décocher et griser la checkBox2
Et si la checkBox1 est coché réactiver la checkBox2 et la cocher en même temps

Voila c'est tout bête mais je ne trouve pas comment y arriver, merci d'avance pour votre aide

6 réponses

Messages postés
14570
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 août 2020
559
Bonjour
  • Winform
  • WPF
  • ASP
  • Autre


Messages postés
14570
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 août 2020
559
Et aussi, tu utilises le binding ou tu t'embêtes à gérer les controles "à la main"?
Messages postés
27
Date d'inscription
lundi 30 octobre 2017
Statut
Membre
Dernière intervention
4 août 2020
>
Messages postés
14570
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 août 2020

WPF
Étant donné que je ne vois pas de quoi tu parle j'imagine "à la main" ?

j'insère l'affreusité que je suis en train de créer (je cherche à taton complet dans une autre galaxie) :

            if (checkBox3.IsChecked == true)
{
string choco = "choco install";

if (checkBox8.IsChecked == true)
{
string winrar = " winrar";
}
if (checkBox9.IsChecked == true)
{
string firefox = " firefox";
}
if (checkBox10.IsChecked == true)
{
string vlc = " vlc";
}
if (checkBox11.IsChecked == true)
{
string ccleaner = " ccleaner";
}
if (checkBox12.IsChecked == true)
{
string teamviewer = " teamviewer";
}
if (checkBox13.IsChecked == true)
{
string anydesk = "";
}
if (checkBox14.IsChecked == true)
{
string adobereader = " adobereader";
}
if (checkBox15.IsChecked == true)
{
string malwarebytes = " malwarebytes";
}
if (checkBox16.IsChecked == true)
{
string libreoffice = "";
}
if (checkBox17.IsChecked == true)
{
string empty = "";
}
string opt_choco = choco;
}


En gros je veux insérer dans un string des bout de commande bat, ici il commence avec "choco install" pour donner si la checkBox8 est coché : "choco install winrar" (choco + winrar)

J'espère que c'est compréhensible =S
Messages postés
14570
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 août 2020
559
Ce qui est incompréhensible c'est de faire du WPF sans savoir ce qu'est le binding.

Y'a pas un code XALM sur le net sans ce mot clé....

Et c'est normal puisque le WPF a été créé pour répondre aux pattern MVC et MVVM qui sont tous les 2 basés sur la liaison de données => binding.


Ensuite le code que tu montres ne fait rien au final.
Je vais juste ajouter des commentaires pour un cas.


                if (checkBox8.IsChecked == true)
                {
                    string winrar = " winrar";//la variable winrar a pour portée le if dans lequel elle est initialisée
                }
                //la variable winrar n'existe plus ici


Et c'est pareil pour toute tes variables, y compris opt_choco


Pour faire ce que tu souhaites, comme WPF est prévu, il faut commencer par écrire un objet dont le job sera de construire ton string et un objet qui écrit une ligne de ton string.

Tous deux implémentent InotifyPropertyChanged
using System.ComponentModel;

namespace Test_WPF
{
    class OptionInstall : INotifyPropertyChanged
    {

        public OptionInstall(string LaCommande)
        {
            Commande = LaCommande;
        }

        private bool install = false;
        /// <summary>
        /// Retourne ou définit si cette option est installée
        /// </summary>
        public bool IsInstall
        {
            get { return install; }
            set
            {
                if (install != value)
                {
                    install = value;
                    GenerePropertyChanged("IsInstall");
                }
            }
        }

        private string commande;
        /// <summary>
        /// Fragment de la commande à construire
        /// </summary>
        public string Commande
        {
            get { return commande; }
            set
            {
                if (commande != value)
                {
                    commande = value;
                    GenerePropertyChanged("Commande");
                }
            }
        }

        /// <summary>
        /// ToString personnalisé construisant une commande par instance
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format("choco install {0}", commande.ToLower());
        }

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void GenerePropertyChanged(string Propriete)
        {
            if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete));
        }

        #endregion
    }
}


using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;

namespace Test_WPF
{
    class BatchCreator : INotifyPropertyChanged
    {

        private ObservableCollection<OptionInstall> options = new ObservableCollection<OptionInstall>
            {
                new OptionInstall("Winrar"),
                new OptionInstall("Firefox"),
            //etc tu ajoutes toutes tes options

            }; //collection permettant la construction du batch


        private bool choco = false;
        /// <summary>
        /// Retourne ou définit si la commande sera construite
        /// </summary>
        public bool Choco
        {
            get { return choco; }
            set
            {
                if (choco != value)
                {
                    choco = value;
                    GenerePropertyChanged("Choco");

                    if (choco == false)//dans la négative on désactive toutes les autres options 
                        foreach (OptionInstall o in options)
                            if (o.IsInstall)
                            {
                                o.IsInstall = false;
                            }
                }
            }
        }


        /// <summary>
        /// Retourne la liste d'options
        /// </summary>
        public ObservableCollection<OptionInstall> Options
        {
            get { return options; }
        }

        //etc pour chaque option

        /// <summary>
        /// Méthode servant à créer le batch
        /// </summary>
        /// <returns></returns>
        public string CreerBatch()
        {
            if (!choco)
                return string.Empty;

            var lignes = options.Where(o => o.IsInstall).Select(o => o.ToString());

            return string.Join(Environment.NewLine, lignes);
        }

        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void GenerePropertyChanged(string Propriete)
        {
            if (this.PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(Propriete));
        }

        #endregion

    }
}


Sur ma fenêtre, il y a un checkbox qui permet l'accès aux options (dans une listbox) et au bouton créé, le nombre d'options, les chekbox, les enabled etc... sont tous gérés par binding

<Window x:Class="Test_WPF.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test_WPF"
        mc:Ignorable="d"
        Title="Window1" Height="450" Width="800">
    <Grid>
        <CheckBox Content="Créer commandes" IsChecked="{Binding Choco}" Width="150" Height="20" Margin="321,44,321,355"/>
        <ListBox ItemsSource="{Binding Options}" Width="150" Height="280" IsEnabled="{Binding Choco}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding Commande}" IsChecked="{Binding IsInstall}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button Content="Créer" IsEnabled="{Binding Choco}" HorizontalAlignment="Left" Margin="348,354,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>


    </Grid>
</Window>


Enfin le code behind de la fenêtre
using System.Windows;

namespace Test_WPF
{
    /// <summary>
    /// Logique d'interaction pour Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        BatchCreator creator = new BatchCreator();
        public Window1()
        {
            InitializeComponent();
            this.DataContext = creator; //on binde la fenetre sur le créateur
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            string fichier = creator.CreerBatch();
        }
    }
}



PS le code c'est mieux en couleur non? Voir ici comment bien utiliser les balises sur le site https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Messages postés
14570
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 août 2020
559
J'ai oublié de poster le résultat

Quand le checkbox principal est décoché, on n'a accès à rien


Une fois activé, on peut choisir une option et cliquer sur le bouton


Ce qui donne
Messages postés
27
Date d'inscription
lundi 30 octobre 2017
Statut
Membre
Dernière intervention
4 août 2020

Merci pour ta réponse plus que complète pourrais tu me donner un lien pour télécharger ton projet car j'ai du mal a voir ce que je dois mettre où ?
Je précise que je n'ai pas fait d'étude la dedans juste quelques programmes assez basiques en autodidacte c'est pourquoi il me manque certainement beaucoup de base dans ce langage
J’apprécie beaucoup ton investissement dans ta réponse
Messages postés
14570
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 août 2020
559
Je t'ai donné le code complet d'une fenêtre donc télécharger le projet ne changerait pas grand chose.

Je précise que je n'ai pas fait d'étude la dedans juste quelques programmes assez basiques en autodidacte c'est pourquoi il me manque certainement beaucoup de base dans ce langage


Je suis autodidacte aussi, mais j'ai fait l'effort d'apprendre les bases....
Pour le C#
https://tahe.developpez.com/dotnet/csharp/

Et pour WPF
https://lite.qwant.com/?q=wpf+par+la+pratique+thomas+lebrun&client=opensearch

Messages postés
27
Date d'inscription
lundi 30 octobre 2017
Statut
Membre
Dernière intervention
4 août 2020

je n'arrive pas à faire fonctionner ton code, je ne sais pas exactement ce que je dois mettre où, c'est pour ça que j'aurais bien aimé télécharger le projet pour comprendre comment ça fonctionne

J'avais fait un cours sur le site du zéro à l'époque (openclassroom maintenant) mais j'avais 16-17 ans et je faisais ça après les cours donc je n'ai pas donné beaucoup d'importance à l'univers C#. On va dire que je cherchais seulement ce que je voulais faire sur le moment maintenant j'en ai 23 donc je me rappelle vaguement.

En tout cas merci pour ton aide, ce que tu me propose ici n'a rien à voir avec les fonctions plus que basique que j'utilisais à l'époque
Messages postés
14570
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
6 août 2020
559
Lien valable 21 jours
https://www.cjoint.com/c/JHem4m3kNt5