Question
[Résolu]:[AD] GUI - Actualiser formulaire
- PoSH_Newbie
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
Tout d'abord bravo pour votre site qui m'a donné envie de découvrir PowerShell et qui me sert désormais de + en + (à la fois en privé et en pro).
Je suis en train de faire quelque essais de création de formulaires GUI pour de la gestion AD.
Les éléments que je souhaite mettre en place dans ce formulaire sont les suivants:
- Liste des Cmdlets AD dans un TextBox [A](ici, pas de PB)
- un autre TextBox qui ferait apparaitre automatiquement le get-help de la cmdlet sélectionnée dans [A]
- le reste n'est pas bien important pour le sujet.
Voici Le code en place Actuellement:
[code:1]# Import Module AD ========================================================
Import-Module ActiveDirectory
#############################################################################
### LES VARIABLES ###########################################################
#############################################################################
# Positionnements des composants dans le formulaire =======================
## Définition des Lignes du formulaire
$lin1 = 10
$Lin2 = 40
$Lin3 = 80
$Lin4 = 100
$Lin5 = 460
$Lin6 = 480
## Définition des Colonnes du formulaire
$col1 = 50
$col2 = 350
# Dimensionnements des composants du formulaire ===========================
## Définition des Largeurs des composants
$Larg1 = 1200
$Larg2 = 260
$Larg3 = 700
$Larg4 = 1024
## Définition des Hauteurs des composants
$Haut1 = 800
$Haut2 = 22
$Haut3 = 400
$Haut4 = 250
## Définition de La Taille du Texte des composants
$SizeTxt = 12
$PoliceTxt = \"Calibri\"
#############################################################################
### LES OBJETS GRAPHIQUES ###################################################
#############################################################################
#Section1. FORMULAIRE#
# Création du Formulaire ===================================================
[void] [System.Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\"«»)
[void] [System.Reflection.Assembly]::LoadWithPartialName(\"System.Drawing\"«»)
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = \"AJ - AD - Cmdlets Console\"
$objForm.Size = New-Object System.Drawing.Size($Larg1,$Haut1)
$objForm.StartPosition = \"CenterScreen\"
#FinSection1
#Section2. ETIQUETTES#
#2.1 Ajout de l'étiquette \"Commandes\" =========================================
$objlblcommandes = $objCmdletsListbox = New-Object System.Windows.Forms.label
$objlblcommandes.Location = New-Object System.Drawing.Size($col1,$Lin1)
$objlblcommandes.Size = New-Object System.Drawing.Size($Larg2,$Haut2)
$objlblcommandes.Font = New-Object System.Drawing.Font($PoliceTxt, \"$SizeTxt\", [System.Drawing.FontStyle]::Bold)
$objlblcommandes.text = \"Commandes\"
$objForm.Controls.Add($objlblcommandes)
#2.1 Ajout de l'étiquette \"Get-Help Commande sélectionnée\" ====================
$objlblMANUEL = $objCmdletsListbox = New-Object System.Windows.Forms.label
$objlblMANUEL.Location = New-Object System.Drawing.Size($col1,$Lin5)
$objlblMANUEL.Size = New-Object System.Drawing.Size($Larg4,$Haut2)
$objlblMANUEL.text = \"Get-Help de la Commande sélectionnée\"
$objlblMANUEL.Font = New-Object System.Drawing.Font($PoliceTxt, \"$SizeTxt\", [System.Drawing.FontStyle]::Bold)
$objForm.Controls.Add($objlblMANUEL)
#2.2 Ajout de l'étiquette \"Résultat de Commande avec Valeur\" ====================
$objlblMANUEL = $objCmdletsListbox = New-Object System.Windows.Forms.label
$objlblMANUEL.Location = New-Object System.Drawing.Size($col2,$Lin3)
$objlblMANUEL.Size = New-Object System.Drawing.Size($Larg3,$Haut2)
$objlblMANUEL.Font = New-Object System.Drawing.Font($PoliceTxt, \"$SizeTxt\", [System.Drawing.FontStyle]::Bold)
$objlblMANUEL.text = \"Résultat de la Commande passée selon Valeurs définies\"
$objForm.Controls.Add($objlblMANUEL)
#FinSection2.
#Section3. LES CHAMPS DE SAISIE#
#3.1 Ajout de la ListBox contenant les cmdlets ================================
### --- Cet objet (texte multiligne) placé dans la colonne de gauche référence la liste des commandes pouvant être passées ---
$objCmdletsListbox = New-Object System.Windows.Forms.Listbox
$objCmdletsListbox.Location = New-Object System.Drawing.Size($col1,$Lin2)
$objCmdletsListbox.Size = New-Object System.Drawing.Size($Larg2,$Haut3)
$objCmdletsListbox.Font = New-Object System.Drawing.Font($PoliceTxt, \"10\"«»)
$objCmdletsListbox.BackColor = [System.Drawing.Color]::Lightgreen
$items = Invoke-Expression \"Get-Command -module ActiveDirectory\"
foreach ($item in $items)
{
[void] $objCmdletsListbox.Items.Add($item.Name)
}
$objForm.Controls.Add($objCmdletsListbox)
#3.2 Ajout du TXT_Value au Formulaire =======================================
### --- Cet objet (texte simple ligne) placé dans la colonne de droite référence les variables de la commande devant être passée
### Le Résultat s'affichera alors dans la textBox Commande passée avec Valeur ---
$objValueBox = New-Object System.Windows.Forms.TextBox
$objValueBox.Location = New-Object System.Drawing.Size($col2,$Lin2)
$objValueBox.Size = New-Object System.Drawing.Size($Larg3,$Haut2)
$objValueBox.Font = New-Object System.Drawing.Font($PoliceTxt, \"$SizeTxt\"«»)
# $objValueBox.ReadOnly = $True
# $objValueBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
$objForm.Controls.Add($objValueBox)
#3.3 Ajout du Text Box (Get-Help) au Formulaire =========================================
$objOutputBox = New-Object System.Windows.Forms.TextBox
$objOutputBox.Location = New-Object System.Drawing.Size($col1,$Lin6)
$objOutputBox.Size = New-Object System.Drawing.Size($Larg4,$Haut4)
$objOutputBox.Multiline = $True
$objOutputBox.Font = New-Object System.Drawing.Font($PoliceTxt, \"10\"«»)
$ObjOutPutBox.BackColor = [System.Drawing.Color]::LightYellow
$objOutputBox.Wordwrap = $True
$objOutputBox.ReadOnly = $True
$objOutputBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
#3.4 Ajout du Text Box (Commande passée avec valeur) au Formulaire =========================================
$objResultBox = New-Object System.Windows.Forms.TextBox
$objResultBox.Location = New-Object System.Drawing.Size($col2,$Lin4)
$objResultBox.Size = New-Object System.Drawing.Size($Larg3,$Haut4)
$objResultBox.Multiline = $True
$objResultBox.Font = New-Object System.Drawing.Font($PoliceTxt, \"$SizeTxt\"«»)
$ObjResultBox.ForeColor = [System.Drawing.Color]::LightGreen
$ObjResultBox.BackColor = [System.Drawing.Color]::«»DarkBlue
$objResultBox.Wordwrap = $True
# $objResultBox.ReadOnly = $True
$objResultBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
$objForm.Controls.Add($objResultBox)
#FinSection3.
#Section4. LES BOUTONS
#4.1 Ajout du bouton \"Valeur\" =====================================
$objBTNValue = $objCmdletsListbox = New-Object System.Windows.Forms.Button
$objBTNValue.Location = New-Object System.Drawing.Size($col2,$Lin1)
$objBTNValue.Size = New-Object System.Drawing.Size($Larg2,$Haut2)
$objBTNValue.Font = New-Object System.Drawing.Font($PoliceTxt, \"$SizeTxt\"«»)
$objBTNValue.text = \"Valeur\"
$objForm.Controls.Add($objBTNValue)
#############################################################################
### LES Actions à effectuer par Objet #######################################
#############################################################################
# Action Get-Help lors d'un click dans la listBox =========================
$objCmdletsListbox.add_Click(
{
$cmdlet = $objCmdletsListbox.SelectedItem
read-host $cmdlet.text
[String]$MANUEL = iex \"get-help $cmdlet\"
$objOutputbox.text= \"$MANUEL\"
$objForm.Controls.Add($objOutputBox)
$objForm.Controls.Add($objlblMANUEL)
$objform.refresh()
}
)
#############################################################################
### LES OPERATIONS ##########################################################
#############################################################################
# Activation du formulaire Principal =====================================================================
$objForm.Add_Shown({$objForm.Activate()})
$objForm.add_keyDown({if ($_.keycode -eq \"Escape\"«») {$objForm.dispose()}}) #Action touche echap
[void] $objForm.ShowDialog()
[/code:1]
Différents pb:
PROBLEME 1. je n'arrive pas à récupérer le résultat de la commande get-help <Cmdlet sélectionnée en [A]> ==> le résultat donne à chaque fois le descriptif de la cmdlet get-help.
pour ce point, je pense que le problème se situe ici:
[code:1] $cmdlet = $objCmdletsListbox.SelectedItem
read-host $cmdlet.text
[String]$MANUEL = iex \"get-help $cmdlet\"[/code:1]
j'imagine que je cherche à récupérer une valeur texte depuis une variable de type VOID et c'est là que \"ça se Corse\" comme dirait mon cousin Manolo ;p.
Je ne suis pas développeur et ignore le contournement à effectuer pour effectuer le bon get-help...
PROBLEME 2: Je n'arrive pas à faire actualiser correctement mon formulaire principal afin d'afficher de façon dynamique la valeur de ma commande get-Help dans le cadre prévu à cet effet. Actuellement, même si le bouton créé ne possède aucune action, cela me permet de faire afficher le résultat de Get-Help -Detailed...
PROBLEME 3:
[code:1]$objForm.add_keyDown({if ($_.keycode -eq \"Escape\"«») {$objForm.dispose()}}) #Action touche echap [/code:1]
Pour cela, bien que déjà utilisé dans d'autres formulaires créé précédemment, l'action ne s'effectue pas...
Merci de vos retours d'avance.<br><br>Message édité par: PowerShell Newbie, à: 14/11/12 15:23
PowerShell-scripting.com = alias de SHARE-PSKnowledge
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
PowerShell Newbie écrit:
Sous Powershell une variable est typée ou pas, ensuite c'est de la sémantique. Pour moi une variable de type VOID cela n'existe pas, mais une variable sans type oui :j'imagine que je cherche à récupérer une valeur texte depuis une variable de type VOID
[code:1]
$i='20'
$v=gv i
$v.Attributes # rien
[int]$i='20'
$v=gv i
$v.Attributes # contrainte sur le type [INT]
[/code:1]
En revanche pour un appel de méthode, [VOID] existe et indique que l'on ne récupère pas la valeur de retour.
PowerShell Newbie écrit:
Dans ce cas il faut étudier ce que te renvoi tes commandes : Write-Warning $cmdlet.GetType() ...PROBLEME 1. je n'arrive pas à récupérer le résultat de la commande get-help <Cmdlet sélectionnée en [A]> ==> le résultat donne à chaque fois le descriptif de la cmdlet get-help.
Tu supposes que ta sélection te renvoi un objet de type CmdletInfo : read-host $cmdlet.text
Ce qui est contradictoire avec la ligne suivante : [void] $objCmdletsListbox.Items.Add($item.Name)
Dans ce cas mieux vaut utiliser le databinding.
Tu as dans ton code des lignes d'affectation multiple :
[code:1]
$objlblcommandes = $objCmdletsListbox = New-Object System.Windows.Forms.label
[/code:1]
Je n'ai pas compris leurs usage, je les ai donc supprimés.
PowerShell Newbie écrit:
Essaie déjà de mettre en oeuvre le principe en dehors d'un GUI.Je ne suis pas développeur et ignore le contournement à effectuer pour effectuer le bon get-help...
L'appel à Invoke-Expression n'est pas nécessaire dans ton contexte.
Voici ce que j'ai modifié :
[code:1]
$objCmdletsListbox.add_Click(
{
$cmdlet = $objCmdletsListbox.SelectedItem
$objOutputbox.text= get-help $cmdlet -Full|Out-String
[/code:1]
Le Out-String évite de récupérer des objets de Formatage.
PowerShell Newbie écrit:
Je n'ai pas compris. Essaie avec la nouvelle version.PROBLEME 2:
PowerShell Newbie écrit:
Je te propose ceci :PROBLEME 3:
[code:1]
$objForm.Add_Shown(
{
#La forme reçoit les événements de touche avant que
# l'événement ne soit passé au contrôle ayant le focus.
$objForm.KeyPreview = $true;
$objForm.Activate()
}
)
#Action touche echap
$objForm.add_keyPress(
{if ($_.keychar -eq [char]27)
{$objForm.Close()}
}
)
[void] $objForm.ShowDialog()
$objForm.Dispose()
{/code] [/code:1]<br><br>Message édité par: Laurent Dardenne, à: 3/11/12 13:32
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- PoSH_Newbie
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
Tu as dans ton code des lignes d'affectation multiple :
Code:
[code:1]$objlblcommandes = $objCmdletsListbox = New-Object System.Windows.Forms.label[/code:1]
Je n'ai pas compris leurs usage, je les ai donc supprimés.
Oui en effet j'ai utilisé un modèle de ligne à reproduire dans la conception sans penser à effacer la partie à remplacer par une nouvelle valeur. Merci pour cette correction
Voici ce que j'ai modifié :
Code:
[code:1]
$objCmdletsListbox.add_Click(
{
$cmdlet = $objCmdletsListbox.SelectedItem
$objOutputbox.text= get-help $cmdlet -Full|Out-String
[/code:1]
Le Out-String évite de récupérer des objets de Formatage.
Cela semble effectivement plus logique
PROBLEME 2:
Je n'ai pas compris. Essaie avec la nouvelle version.
[/code]
Voici la Source d'inspiration pour création de ce script: blogs.technet.com/b/csps/archive/2011/12/07/guiapp.aspx
Ce que je souhaite faire depuis la liste des Cmdlets AD, c'est une fois cliqué sur l'une des cmdlet (pour l'exemple on va prendre un get-ADUser), faire afficher le get-help Get-ADUser dans le cadre du bas de mon formulaire.
actuellement le résultat ne s'affiche pas dynamiquement.
Cependant curieusement , si je clique dans le formulaire sur le Bouton créé (qui n'a pour l'instant rien à voir et n'a pas de code associé), je récupère l'affichage de la commande get-help
Pour cette partie, j'ai l'impression que ma variable $cmdlet ne récupère aucune valeur.
Je pense que le problème doit se situer au niveau de ma demande d'actualisation de l'affichage afin de voir instantanément mon résultat
[code:1]# Action Get-Help lors d'un click dans la listBox =========================
$objCmdletsListbox.add_Click(
{
$cmdlet = $objCmdletsListbox.SelectedItem
$objOutputbox.text= get-help $cmdlet -Full|Out-String
$objForm.Controls.Add($objOutputBox)
$objForm.Controls.Add($objlblMANUEL)
$objform.refresh()
}[/code:1]
==> Le [code:1]$objForm.refresh()[/code:1] ne semble pas être la commande à passer pour actualiser le formulaire.
Maintenant, si j'envisage de remplacer par un .dispose(), je perd mon formulaire ==> j'ajoute un commande pour le recharger: les valeurs ne sont plus définies
PowerShell-scripting.com = alias de SHARE-PSKnowledge
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Je ne vois pas de quel bouton tu parlessi je clique dans le formulaire sur le Bouton créé
Pour qu'un événement se déclenche il doit y avoir un eventhandler associè.
Et avec ceci :
[code:1]
$objForm.Controls.Add($objOutputBox)
$objForm.Controls.Add($objlblMANUEL)
$objform.refresh()
[/code:1]
tu ajoutes tjr les mêmes instances.
Quel est ton intention en procédant ainsi ?
PowerShell Newbie écrit:
Le plus souvent le refresh est à la charge du composant qui voit ses propriétes modifiés.Je pense que le problème doit se situer au niveau de ma demande d'actualisation de l'affichage afin de voir instantanément mon résultat
Quant à Dispose() en connais-tu l'usage ?<br><br>Message édité par: Laurent Dardenne, à: 5/11/12 20:51
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- PoSH_Newbie
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
je me basais sur un Formulaire GUI qui générait plusieurs sous-formulaires en mode Boite de Dialogue.
Cela ne donnait donc aucune erreur avec une méthode .dispose() sur un sous-formulaire puisque le formulaire parent restait ouvert et ce n'est pas le cas ici...
j'ai simplifié le formulaire et corrigé certains problèmes grâce à tes remarques.
voici le nouveau code:
[code:1]
# Import Module AD ========================================================
Import-Module ActiveDirectory
#############################################################################
### LES VARIABLES ###########################################################
#############################################################################
# Positionnements des composants dans le formulaire =======================
## Définition des Lignes du formulaire
$lin1 = 10
$Lin2 = 40
$Lin3 = 300
$Lin4 = 320
## Définition des Colonnes du formulaire
$col1 = 50
$col2 = 350
# Dimensionnements des composants du formulaire ===========================
## Définition des Largeurs des composants
$Larg1 = 900
$Larg2 = 260
$Larg3 = 700
$Larg4 = 1024
## Définition des Hauteurs des composants
$Haut1 = 900
$Haut2 = 22
$Haut3 = 400
$Haut4 = 250
## Définition de La Taille du Texte des composants
$SizeTxt = 12
$PoliceTxt = \"Calibri\"
#############################################################################
### LES OBJETS GRAPHIQUES ###################################################
#############################################################################
#Section1. FORMULAIRE#
# Création du Formulaire ===================================================
[void] [System.Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\"«»)
[void] [System.Reflection.Assembly]::LoadWithPartialName(\"System.Drawing\"«»)
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = \"Console d'aide - Cmdlets par Module sélectionné\"
$objForm.Size = New-Object System.Drawing.Size($Larg1,$Haut1)
$objForm.StartPosition = \"CenterScreen\"
#FinSection1
#Section2. ETIQUETTES#
#2.1 Ajout de l'étiquette \"Commandes\" =========================================
$Script:objlblcommandes = New-Object System.Windows.Forms.label
$objlblcommandes.Location = New-Object System.Drawing.Size($col1,$Lin1)
$objlblcommandes.Size = New-Object System.Drawing.Size($Larg2,$Haut2)
$objlblcommandes.Font = New-Object System.Drawing.Font($PoliceTxt, \"$SizeTxt\", [System.Drawing.FontStyle]::Bold)
$objlblcommandes.text = \"2. Commandes\"
$objForm.Controls.Add($objlblcommandes)
#2.2 Ajout de l'étiquette \"Get-Help Commande sélectionnée\" ====================
$Script:objlblMANUEL = New-Object System.Windows.Forms.label
$objlblMANUEL.Location = New-Object System.Drawing.Size($col1,$Lin3)
$objlblMANUEL.Size = New-Object System.Drawing.Size($Larg3,$Haut2)
$objlblMANUEL.text = \"3. Get-Help Commande sélectionnée\"
$objlblMANUEL.Font = New-Object System.Drawing.Font($PoliceTxt, \"$SizeTxt\", [System.Drawing.FontStyle]::Bold)
$objForm.Controls.Add($objlblMANUEL)
#FinSection2.
#Section3. LES CHAMPS DE SAISIE#
#3.1 Ajout de la ListBox contenant les cmdlets ================================
### --- Cet objet (texte multiligne) placé dans la colonne de gauche référence la liste des commandes pouvant être passées ---
$Script:objCmdletsListbox = New-Object System.Windows.Forms.Listbox
$objCmdletsListbox.Location = New-Object System.Drawing.Size($col1,$Lin2)
$objCmdletsListbox.Size = New-Object System.Drawing.Size($Larg2,$Haut4)
$objCmdletsListbox.Font = New-Object System.Drawing.Font($PoliceTxt, \"10\"«»)
$objCmdletsListbox.BackColor = [System.Drawing.Color]::Lightblue
$items = Invoke-Expression \"Get-Command -module ActiveDirectory\"
foreach ($item in $items)
{
[void] $objCmdletsListbox.Items.Add($item.Name)
}
$objForm.Controls.Add($objCmdletsListbox)
#3.2 Ajout du Text Box (Get-Help) au Formulaire =======================
$Script:objOutputBox = New-Object System.Windows.Forms.TextBox
$objOutputBox.Location = New-Object System.Drawing.Size($col1,$Lin4)
$objOutputBox.Size = New-Object System.Drawing.Size($Larg3,$Haut3)
$objOutputBox.Multiline = $True
$objOutputBox.Font = New-Object System.Drawing.Font($PoliceTxt, \"10\"«»)
$ObjOutPutBox.BackColor = [System.Drawing.Color]::LightYellow
$objOutputBox.Wordwrap = $True
$objOutputBox.ReadOnly = $True
$objOutputBox.ScrollBars = [System.Windows.Forms.ScrollBars]::Vertical
#FinSection3.
#Section4. LES BOUTONS
#FinSection4.
#############################################################################
### LES Actions à effectuer par Objet #######################################
#############################################################################
# Action Get-Help lors d'un click dans la listBox Cmdlets================
$objCmdletsListbox.add_Click(
{
$Script:cmdlet = $objCmdletsListbox.SelectedItem
$Script:MANUEL = get-help $cmdlet |out-String
$objOutputbox.text= $MANUEL
$objForm.Controls.Add($objOutputBox)
$objForm.Controls.Add($objlblMANUEL)
$objform.Update()
}
)
#############################################################################
### LES OPERATIONS ##########################################################
#############################################################################
# Activation du formulaire Principal ========================================
$objForm.Add_Shown({$objForm.Activate()})
$objForm.Add_Shown(
{
#La forme reçoit les événements de touche avant que
# l'événement ne soit passé au contrôle ayant le focus.
$objForm.KeyPreview = $true;
$objForm.Activate()
}
)
#Action touche echap
$objForm.add_keyPress(
{if ($_.keychar -eq [char]27) {$objForm.Close()}}
)
[void] $objForm.ShowDialog()[/code:1]
Par la suite, je souhaite y mettre une partie module à sélectionner pour avoir les cmdlets associée et enfin le Get-Help correspondant à la cmdlet sélectionnée.
Merci encore Laurent pour tes
PowerShell-scripting.com = alias de SHARE-PSKnowledge
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
De rien, je pense que je vais réutiliser ton code pour une formation interne sur les GUI WinformMerci encore Laurent
La relation maître-détail avec des composants de base est intéressante à présenter.
Et avec des commentaires en plus !
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu]:[AD] GUI - Actualiser formulaire