Question [Résolu]:[AD] GUI - Actualiser formulaire

Plus d'informations
il y a 13 ans 4 mois #12996 par PoSH_Newbie
Bonjour,

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...:S

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...:huh:


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.

Plus d'informations
il y a 13 ans 4 mois #12997 par Laurent Dardenne
Salut,
PowerShell Newbie écrit:

j'imagine que je cherche à récupérer une valeur texte depuis une variable de type VOID

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 :
[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:

PROBLEME 1. je n'arrive pas à récupérer le résultat de la commande get-help &lt;Cmdlet sélectionnée en [A]&gt; ==&gt; le résultat donne à chaque fois le descriptif de la cmdlet get-help.

Dans ce cas il faut étudier ce que te renvoi tes commandes : Write-Warning $cmdlet.GetType() ...
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:

Je ne suis pas développeur et ignore le contournement à effectuer pour effectuer le bon get-help...

Essaie déjà de mettre en oeuvre le principe en dehors d'un GUI.

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:

PROBLEME 2:

Je n'ai pas compris. Essaie avec la nouvelle version.
PowerShell Newbie écrit:

PROBLEME 3:

Je te propose ceci :
[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.

Plus d'informations
il y a 13 ans 4 mois #13001 par PoSH_Newbie
Merci Laurent, cela m'a permis d'avancer partiellement :)

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 :S

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]

==&gt; 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 ==&gt; 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.

Plus d'informations
il y a 13 ans 4 mois #13002 par Laurent Dardenne
PowerShell Newbie écrit:

si je clique dans le formulaire sur le Bouton créé

Je ne vois pas de quel bouton tu parles :pinch:
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:

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

Le plus souvent le refresh est à la charge du composant qui voit ses propriétes modifiés.

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.

Plus d'informations
il y a 13 ans 4 mois #13033 par PoSH_Newbie
Merci pour ta question qui m'a fait remettre en question le modèle de formulaire GUI que j'utilisais.

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 = \&quot;Calibri\&quot;


#############################################################################
### LES OBJETS GRAPHIQUES ###################################################
#############################################################################

#Section1. FORMULAIRE#

# Création du Formulaire ===================================================


[void] [System.Reflection.Assembly]::LoadWithPartialName(\&quot;System.Windows.Forms\&quot;«»)
[void] [System.Reflection.Assembly]::LoadWithPartialName(\&quot;System.Drawing\&quot;«»)

$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = \&quot;Console d'aide - Cmdlets par Module sélectionné\&quot;
$objForm.Size = New-Object System.Drawing.Size($Larg1,$Haut1)
$objForm.StartPosition = \&quot;CenterScreen\&quot;

#FinSection1


#Section2. ETIQUETTES#

#2.1 Ajout de l'étiquette \&quot;Commandes\&quot; =========================================

$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, \&quot;$SizeTxt\&quot;, [System.Drawing.FontStyle]::Bold)
$objlblcommandes.text = \&quot;2. Commandes\&quot;

$objForm.Controls.Add($objlblcommandes)


#2.2 Ajout de l'étiquette \&quot;Get-Help Commande sélectionnée\&quot; ====================

$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 = \&quot;3. Get-Help Commande sélectionnée\&quot;
$objlblMANUEL.Font = New-Object System.Drawing.Font($PoliceTxt, \&quot;$SizeTxt\&quot;, [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, \&quot;10\&quot;«»)
$objCmdletsListbox.BackColor = [System.Drawing.Color]::Lightblue
$items = Invoke-Expression \&quot;Get-Command -module ActiveDirectory\&quot;

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, \&quot;10\&quot;«»)
$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 B) éblouissantes suggestions :) .<br><br>Message édité par: PowerShell Newbie, à: 14/11/12 15:08


PowerShell-scripting.com = alias de SHARE-PSKnowledge

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

Plus d'informations
il y a 13 ans 4 mois #13035 par Laurent Dardenne
PowerShell Newbie écrit:

Merci encore Laurent

De rien, je pense que je vais réutiliser ton code pour une formation interne sur les GUI Winform :P .

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.

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