Question Problème de désélection sur une \"CheckedListbox\"

Plus d'informations
il y a 10 ans 2 mois #21597 par Guillaume
Bonjour à tous,

Je tente d'écrire un programme utilisant une GUI où je dois sélectionner une ou plusieurs agences. Le fait de sélectionner une agence active le bouton \"OK\". Le principe est que si plus aucune agence n'est sélectionnée, le bouton \"OK\" doit se désactiver. Du coup, je me base sur la propriété \"SelectedItem\" à chaque changement de sélection.

La variable est $Liste_Agence :
- Si je quitte de suite et que je regarde les propriétés de cette variable, rien n'est rempli au niveau de la propriété \"SelectedItem\" évidemment.
- Si je sélectionne une agence ou plusieurs agences et que je valide, \"SelectedItem\" contient les valeurs sélectionnées et le bouton \"OK\" s'active, là aussi, tout est normal.
- Si en revanche, je sélectionne une agence et que je la désélectionne, le bouton \"OK\" ne se désactive pas. Quand je regarde la propriété \"SelectedItem\", elle contient toujours le dernier nom décoché (et la propriété \"SelectedIndex\" ne revient donc jamais à l'état \"-1\" qui est l'état pour que le bouton \"OK\" soit décoché).

Fichier attaché :


Comme on peut le voir sur l'image, la case \"Lyon\" est décochée mais toujours surlignée et quand on quitte ou que l'on valide, les valeurs \"SelectedItem\" et \"SelectedIndex\" correspondent à celles de \"Lyon\".

Voici le code :

[code:1]# AJOUT CLASSE .NET FRAMEWORK
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing


#====================
# 1 - FORMULAIRE
#====================

#====================
# 1.1 - CADRE
#====================

# CADRE GENERAL
$Cadre = New-Object System.Windows.Forms.Form
$Cadre.ControlBox = $True
$Cadre.Text = \"Copie de fichiers vers partages\"
$Cadre.Size = New-Object System.Drawing.Size(540,700)
$Cadre.StartPosition = \"CenterScreen\"
$Cadre.Icon = [system.drawing.icon]::ExtractAssociatedIcon($PSHOME + \"\powershell.exe\"«»)
$Cadre.Topmost = $True

#====================
# 1.2 - BOUTONS
#====================

# BOUTON \"CREER\"
$Bouton_OK = New-Object System.Windows.Forms.Button
$Bouton_OK.Location = New-Object System.Drawing.Point(300,505)
$Bouton_OK.Size = New-Object System.Drawing.Size(160,40)
$Bouton_OK.Font = New-Object System.Drawing.Font(\"Microsoft Sans Serif\",10,[System.Drawing.FontStyle]::Bold)
$Bouton_OK.ForeColor = 'Green'
$Bouton_OK.Text = \"Lancer la copie\"
$Bouton_OK.Enabled = $False
$Bouton_OK.DialogResult = [System.Windows.Forms.DialogResult]::OK
$Cadre.AcceptButton = $Bouton_OK
$Cadre.Controls.Add($Bouton_OK)

# BOUTON \"ANNULER\"
$Bouton_Annuler = New-Object System.Windows.Forms.Button
$Bouton_Annuler.Location = New-Object System.Drawing.Point(300,575)
$Bouton_Annuler.Size = New-Object System.Drawing.Size(160,40)
$Bouton_Annuler.Font = New-Object System.Drawing.Font(\"Microsoft Sans Serif\",10,[System.Drawing.FontStyle]::Regular)
$Bouton_Annuler.ForeColor = 'Red'
$Bouton_Annuler.Text = \"Quitter\"
$Bouton_Annuler.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$Cadre.CancelButton = $Bouton_Annuler
$Cadre.Controls.Add($Bouton_Annuler)

#====================
# 1.3 - CHAMPS
#====================


# CHAMP AGENCES
$Titre_Agence = New-Object System.Windows.Forms.Label
$Titre_Agence.Location = New-Object System.Drawing.Point(105,10)
$Titre_Agence.Size = New-Object System.Drawing.Size(80,20)
$Titre_Agence.Text = \"Agences\"
$Titre_Agence.Font = New-Object System.Drawing.Font(\"Microsoft Sans Serif\",10,[System.Drawing.FontStyle]::Regular)
$Cadre.Controls.Add($Titre_Agence)

$Liste_Agence = New-Object System.Windows.Forms.CheckedListBox
$Liste_Agence.Location = New-Object System.Drawing.Point(60,40)
$Liste_Agence.Size = New-Object System.Drawing.Size(160,580)
$Liste_Agence.CheckOnClick = $True
$Liste_Agence.SelectionMode = \"One\"
$Cadre.Controls.Add($Liste_Agence)

[void] $Liste_Agence.Items.Add(\"Sélectionner tout\"«»)
[void] $Liste_Agence.Items.Add(\"Ajaccio\"«»)
[void] $Liste_Agence.Items.Add(\"Amiens\"«»)
[void] $Liste_Agence.Items.Add(\"Annecy\"«»)
[void] $Liste_Agence.Items.Add(\"Avignon\"«»)
[void] $Liste_Agence.Items.Add(\"Bastia\"«»)
[void] $Liste_Agence.Items.Add(\"Bayonne\"«»)
[void] $Liste_Agence.Items.Add(\"Belfort\"«»)
[void] $Liste_Agence.Items.Add(\"Bordeaux\"«»)
[void] $Liste_Agence.Items.Add(\"Bourges\"«»)
[void] $Liste_Agence.Items.Add(\"Brest\"«»)
[void] $Liste_Agence.Items.Add(\"Caen\"«»)
[void] $Liste_Agence.Items.Add(\"Calais\"«»)
[void] $Liste_Agence.Items.Add(\"Clermont-Ferrand\"«»)
[void] $Liste_Agence.Items.Add(\"Dijon\"«»)
[void] $Liste_Agence.Items.Add(\"Gennevilliers\"«»)
[void] $Liste_Agence.Items.Add(\"Grenoble\"«»)
[void] $Liste_Agence.Items.Add(\"La Rochelle\"«»)
[void] $Liste_Agence.Items.Add(\"Lille\"«»)
[void] $Liste_Agence.Items.Add(\"Lyon\"«»)
[void] $Liste_Agence.Items.Add(\"Marseille\"«»)


# SELECTIONNER TOUT / DESELECTIONNER TOUT
$Liste_Agence.Add_click({
If($This.selecteditem -eq 'Sélectionner tout'){
If ($This.GetItemCheckState(0) -ne 'Checked') {
For($i=1;$i -lt $Liste_Agence.Items.Count; $i++){
$Liste_Agence.SetItemChecked($i,$true)
} }
Else {
For($i=1;$i -lt $Liste_Agence.Items.Count; $i++){
$Liste_Agence.SetItemChecked($i,$False) }
}
}
})


# CONDITIONS FORMULAIRE OK
$Liste_Agence.Add_SelectedIndexChanged({ Validation_formulaire })


# FONCTION VALIDATION FORMULAIRE
Function Validation_formulaire
{
$Bouton_OK.Enabled = $Liste_Agence.SelectedIndex -ne -1 }


# AFFICHAGE GENERAL
[void]$Cadre.ShowDialog()
[void]$Cadre.Add_Shown({$Cadre.Activate()})[/code:1]


J'ai fait pas mal de recherches mais je n'arrive pas à trouver de solution à mon problème. J'espère que j'ai bien expliqué mon problème.

Je vous remercie par avance.

Guillaume

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 2 mois #21598 par xyz
Ce comportement me semble normal, le problème se situe entre le clavier et le siège :P
Un item peut être selected et checked ou pas.

La collection $Liste_Agence.CheckedItems est peut être plus approprié pour ton traitement.

En passant :
[code:1][void] $Liste_Agence.Items.Add(\"Sélectionner tout\"«»)[/code:1]
doit être remplacé par un menu contextuel.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 2 mois #21601 par Guillaume
Effectivement, ça marche beaucoup mieux ! Je n'ai pas encore toutes les notions...

Et pour cette même raison : je ne vois pas bien ce qu'est un menu contextuel. Qu'est-ce que cela va changer (à priori, cette fonctionnalité est opérationnelle en l'état) ? Et comment la mettre en place ?

Merci beaucoup.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 10 ans 2 mois #21602 par xyz
Réponse de xyz sur le sujet Re:Problème de désélection sur une
Guillaume_F écrit:

Je n'ai pas encore toutes les notions...

Ici il s'agit plus de connaissances que des compétences.

Je te joins une démo autour du composant System.Windows.Forms.ContextMenuStrip

La pièce jointe v2_1_PSh.zip est absente ou indisponible


Tutoriels PowerShell
Pièces jointes :

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.042 secondes
Propulsé par Kunena