Question Creation de plusieurs boutons

Plus d'informations
il y a 12 ans 6 mois #4543 par theanimal
Bonjour,

Je suis à la recherche d'un exemple de code qui génère plusieurs boutons dans un formulaire.
Le nombre de boutons est aléatoire (il varie selon de nombre de ligne d'un fichier csv).
Les boutons seront l'un en dessous de l'autre.

merci pour votre aide.

:)

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

Plus d'informations
il y a 12 ans 6 mois #4547 par Laurent Dardenne
Salut,
theanimal écrit:

Je suis à la recherche d'un exemple de code qui génère plusieurs boutons dans un formulaire.

Tu peux créer une form contenant qq boutons l'un en dessous de l'autre, puis factoriser le code de création des boutons.
Ensuite je suppose que certaines informations proviendrons du fichier csv, si c'est le cas il est préférable de créer une fonction utilisant le pipeline.

Enfin le gestionnaire d'événement onclick sera-t-il commun à tous les boutons ou chaque bouton aura son propre gestionnaire d'événement onclick ?

Connais-tu le maximum de boutons susceptible d'être créés ?

Tutoriels PowerShell

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

Plus d'informations
il y a 12 ans 6 mois #4557 par Laurent Dardenne
Une possible solution :
[code:1]
# Sous PowerShell les boutons doivent doit être placés sur un composant Panel sinon s'ils sont posés directement sur la Form
# la valeur [System.Windows.Forms.FormBorderStyle]::«»Sizable de la propriété $FrmTest.FormBorderStyle posera problème
# lors du redimensionnement de la fenêtre !
#On peut interdire le redimensionnement avec [System.Windows.Forms.FormBorderStyle]::FixedSingle

# Chargement des assemblies externes
[void][Reflection.Assembly]::LoadWithPartialName(\"System.Windows.Forms\"«»)
[void][Reflection.Assembly]::LoadWithPartialName(\"System.Drawing\"«»)

#Les références des boutons crées dynamiquement doivent être mémorisées
$ButtonList= New-Object System.Collections.ArrayList


#Création d'un objet portant les informations utilisées lors de la construction des boutons
$Script:InfoButtons=1|select TabIndex,Spacing,Size,OrigineX,OrigineY,CurrentInsertPoint
#Numéro d'index du bouton.Cette valeur change.
$Script:InfoButtons.TabIndex=0
#Espacement verticale entre 2 boutons.Cette valeur ne change pas.
$Script:InfoButtons.Spacing=40
#Tous les boutons ont la même taille.Cette valeur ne change pas.
$Script:InfoButtons.Size=new-Object System.Drawing.Size(75,23)
#Tous les boutons sont placés au même point horizontale. Cette valeur ne change pas.
$Script:InfoButtons.OrigineX=34
#Point verticale d'insertion du 1er bouton.Cette valeur ne change pas.
$Script:InfoButtons.OrigineY=30
#Chaque bouton est placé à point verticale différent.Cette valeur change.
$Script:InfoButtons.CurrentInsertPoint=$Script:InfoButtons.OrigineY
#On incrémente les valeurs pour le prochain bouton à insérer.
$Script:InfoButtons|Add-Member ScriptMethod Next {
$this.TabIndex++
$this.CurrentInsertPoint+=$this.Spacing
}


# gestionnaire commun à tous les boutons créés dynamiquement
function OnClick_Boutons($Sender,$e){
#Par convention le nom commence par 'OnXXX' mais ce n'est pas obligatoire
#Pour référencer $Sender on adresse la variable automatique $this
#Pour référencer $e on adresse la variable automatique $_

$Nom=($Sender -as [System.Windows.Forms.Button]).Name
#$host.EnterNestedPrompt()
Write-host \"Clic sur le bouton : $Nom\"
}

Function Add-ButtonOnForm([System.Windows.Forms.Panel]$TargetPanel, [String] $Name,[String] $Text) {
#Ajoute dynamiquement un bouton au panel $TargetPanel.

$button = new-object System.Windows.Forms.Button
#mémorise la référence du bouton courant
[void]$ButtonList.Add($Button)
$button.AutoSize = $true
$button.Location = new-object System.Drawing.Point(34, $Script:InfoButtons.CurrentInsertPoint)
$button.Name = $Name
$button.Size =$Script:InfoButtons.Size
$button.TabIndex = $Script:InfoButtons.TabIndex
$button.Text =$Text
$button.UseVisualStyleBackColor = $false
#On abonne le gestionnaire d'événement au gestionnaire commun
#L'index de $ButtonList pointe sur le bouton courant
$button.Add_Click( $ExecutionContext.InvokeCommand.NewScriptBlock( \"OnClick_Boutons `$ButtonList[$($ButtonList.Count-1)] `$EventArgs\"«») )
#Les références des boutons doivent être mémorisées, sinon dans la construction suivante
# $button.Add_Click( {OnClick_Boutons $Button $EventArgs\"} )
#la variable $button n'existera plus au moment de l'appel. La méthode OnClick_Boutons recevant la valeur $Null
#pour le paramètre $Sender.
#
#On créé donc dynamiquement le scriptblock appelant le gestionnaire d'événement,
#en référençant le bouton à l'aide la liste $ButtonList.
#On obtient donc qq chose comme ceci :
# OnClick_Boutons $ButtonList[9] $EventArgs
#La méthode OnClick_Boutons recevra bien la référence du bouton dans le paramètre $Sender.

#D'autres propriétés peuvent être déclarées
#$button.TextAlign =[System.Drawing.ContentAlignment]::MiddleRight
#$button.DialogResult =[System.Windows.Forms.DialogResult]::OK

$TargetPanel.Controls.Add($button);
}

#Construction du panel sur lequel on placera les boutons.
$panel = new-object System.Windows.Forms.Panel
$panel.Dock = [System.Windows.Forms.DockStyle]::Left
$panel.Location = new-object System.Drawing.Point(0, 0)
$panel.Name = \"panel1\"
#$panel.Size = new-object System.Drawing.Size(307, 487)
$panel.Size = new-object System.Drawing.Size(171, 266)
$panel.TabIndex = 0
# !!! Important. cette propriété doit être à $true.
$panel.AutoScroll = $true

# Création de la fenêtre
$FrmTest = new-object System.Windows.Forms.form

# !!! Important. cette propriété doit être à $true.
$FrmTest.AutoScroll = $true
$FrmTest.ClientSize = new-object System.Drawing.Size(171, 266)
$FrmTest.Name = \"FrmTest\"
$FrmTest.Text = \"Form tests boutons\"

$FrmTest.Controls.Add($panel);
#Ajouts dynamique de 10 boutons
Add-ButtonOnForm $Panel \"Bouton1\" \"Test1\"
$Script:InfoButtons.Next()
Add-ButtonOnForm $Panel \"Bouton2\" \"Test de bouton2\"
3..10| Foreach-Object {
$Script:InfoButtons.Next()
Add-ButtonOnForm $Panel \"Bouton$_\" \"Test$_\"
}
#On force la maj de la fenêtre
$FrmTest.Refresh()

# Gestion des events de la fenêtre, rien de particulier ici.
function OnFormClosing_FrmTest10Propriété1($Sender,$e){
# $this est égal au paramètre sender (object)
# $_ est égal au paramètre e (eventarg)

# Déterminer la raison de la fermeture :
# if (($_).CloseReason -eq [System.Windows.Forms.CloseReason]::UserClosing)

#Autorise la fermeture
($_).Cancel= $False
}
$FrmTest.Add_FormClosing( { OnFormClosing_FrmTest10Propriété1 $FrmTest $EventArgs} )
$FrmTest.Add_Shown({$FrmTest.Activate()})
$FrmTest.ShowDialog()
#Libération de la Form
$FrmTest.Dispose()
#Supprime la liste
$ButtonList= $null
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 12 ans 6 mois #4559 par theanimal
Réponse de theanimal sur le sujet Re:Creation de plusieurs boutons
Bonjour,

Merci pour ton aide.
Pour répondre à tes questions, je ne connais pas à l'avance combien de boutons vont être créés, tout dépend du csv. Chaque bouton aura une action différente mais l'évènement sera toujours on_click.
Le but de mon code est de pouvoir faire une interface pour lancer l'installation d'application(MSI).
exemple de csv:
[code:1]Soft,type,Verif,Install
Office 2007,folder,C:\Program Files (x86)\Microsoft Office\Office12,Fichierinstall.msi
Office 2003,Folder,C:\Program Files (x86)\Microsoft Office\Office12,Fichierinstall.msi[/code:1]
Comme tu le dis la solution sera à mon avis la fonction.
Je vais essayer ton code.

merci et à bientot

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

Plus d'informations
il y a 12 ans 5 mois #4567 par Laurent Dardenne
Salut,
une correction au code proposé, il est préférable de crée l'objet au lieu d'utiliser une référence unique :
[code:1]
$Script:InfoButtons.Size=\"new-Object System.Drawing.Size(75,23)\"
#Function Add-ButtonOnForm([System.Windows.Forms.Panel]$TargetPanel, [String] $Name,[String] $Text) {
...
$button.Size = invoke-expression $Script:InfoButtons.Size
...
[/code:1]
Si on souhaite éviter l'usage de la liste $ButtonList on utilisera une recherche dynamique :
[code:1]
#renvoie le bouton nommé Bouton$Number
$sbGetBoutons={
param([Int] $Number)
#Liste des composants contenus dans le panel
$Panel.Controls|`
#Tente un cast de l'objet courant en un bouton
Foreach {$_ -as [System.Windows.Forms.Button]}|`
#Si le cast, effectué dans le segment précédent, échoue il renvoie $null
Where { $_ -ne $null }|`
# On recherche d'après le nom (insensible à la casse)
Where {$_.Name -eq \"Bouton$Number\"}
}

&$sbGetBoutons 5
[/code:1]
Dans ce cas on doit mémoriser le numéro du bouton courant ($button7) dans la fonction .
[code:1]
$global:BoutonNumber=5 #$button5
$ExecutionContext.InvokeCommand.NewScriptBlock( \"OnClick_Boutons (&`$sbGetBoutons $global:BoutonNumber) `$EventArgs\"«»)
[/code:1]
theanimal écrit:

Chaque bouton aura une action différente mais l'évènement sera toujours on_click.

Si cette action tourne autour d'un .MSI, je suppose que c'est tjr la même instruction seul son paramètrage change. Si c'est le cas tu peux construire dynamiquement la méthode OnClick_Boutons en y utilisant un switch sur le nom du bouton.
Bon dev :)

Tutoriels PowerShell

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

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