$Script:Mu ="truc" function ajoutref { [array]$base=Import-Csv -Path c:\temp\base.Csv $global:xb=10 $global:one=0 function I { $global:one += 1 Write-Host $global:one if ($global:one -eq 1) { $Script:InfoButtons.CurrentInsertPoint= $global:U Add-ButtonOnForm $Panel "Bouton$_" "Test$_"} if ($global:one -eq 4) { $Script:InfoButtons.OrigineX += $U*3 $Script:InfoButtons.CurrentInsertPoint= $global:U $global:one=0 } } $global:listeB1 =$base |? {$_.marque -match $Script:Mu} $global:U =45 [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null #Les références des boutons crées dynamiquement doivent être mémorisées $global: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 sur X boutons.Cette valeur ne change pas. $Script:InfoButtons.Spacing=$U*4 #Tous les boutons ont la même taille.Cette valeur ne change pas. $Script:InfoButtons.Size=new-Object System.Drawing.Size(($U*2),($U*2)) #Tous les boutons sont placés au même point horizontale. Cette valeur ne change pas. $Script:InfoButtons.OrigineX=$U #Point verticale d'insertion du 1er bouton.Cette valeur ne change pas. $Script:InfoButtons.OrigineY=$U #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 echo $this.CurrentInsertPoint } # 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 $Script:Mu ="machin" Write-host "Clic sur le bouton : $Script:Mu" $form1.refresh() $form1.Controls.Find($Nom,$false) $Panel.close() } 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 = $false $button.BackgroundImage = [System.Drawing.Image]::FromFile("") $button.BackgroundImageLayout = 4 $button.Location = new-object System.Drawing.Point($Script:InfoButtons.OrigineX, $Script:InfoButtons.CurrentInsertPoint) $button.Name = $script:name $button.Size =$Script:InfoButtons.Size $button.TabIndex = $Script:InfoButtons.TabIndex $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.Name = "panel1" $panel.BackColor = [System.Drawing.Color]::FromArgb(255,105,105,105) $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 845 $System_Drawing_Size.Height = 535 $panel.Size = $System_Drawing_Size $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X = 431 $System_Drawing_Point.Y = 127 $panel.Location = $System_Drawing_Point $panel.TabIndex = 0 # !!! Important. cette propriété doit être à $true. $panel.AutoScroll = $true # Création de la fenêtre $form1 = new-object System.Windows.Forms.form $form1.AutoSize = $True $form1.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240) $form1.Text = "1001bonbonstools" $form1.Name = "form1" $form1.DataBindings.DefaultDataSourceUpdateMode = 0 $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 1284 $System_Drawing_Size.Height = 682 $form1.ClientSize = $System_Drawing_Size $form1.add_Load($handler_form1_Load) $form1.Controls.Add($panel); #Ajouts dynamique de 10 boutons foreach( $listeB2 in $global:listeB1){ echo $listeB2.img $img = 'C:\Users\VERFAIMR\Pictures\Caisse\'+ $listeB2.img $script:name =$listeB2.nomarticle I $Script:InfoButtons.Next() Add-ButtonOnForm $Panel "Bouton$_" "Test$_" } #On force la maj de la fenêtre $form1.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 } $form1.Add_FormClosing( { OnFormClosing_FrmTest10Propriété1 $FrmTest $EventArgs} ) $form1.ShowDialog() #Libération de la Form $form1.Dispose() #Supprime la liste } ajoutref