2017-09-06 3 views
0

Je travaille actuellement sur un projet où je suis désireux de montrer une mise à jour d'état lors de la construction des machines virtuelles. J'ai une fonction qui construit une liste de noms et "prime" la liste. Je pousse alors ceci à un Sapien DataGridView.Fonction de mise à jour personnalisée PSObject pour DataGridView

Le premier fonctionne très bien. Mais j'ai une deuxième fonction que je veux utiliser pour mettre à jour ce statut. Lorsque je mets à jour le statut, il supprime toutes les autres entrées de l'objet ou les duplique. J'ai aussi quelques fois j'appelle cette fonction, il dit qu'il ne peut pas trouver le $VMName même si je le vois dans ma sortie verbeuse.

function Set-Prime($NameArray) { 
    $results = @() 

    foreach ($Name in $namearray) { 
     $OBJ = New-Object -TypeName PSObject 
     $OBJ | Add-Member -MemberType NoteProperty -Name VMName -Value "$Name" 
     $OBJ | Add-Member -MemberType NoteProperty -Name Status -Value "Primed" 
     $results += $OBJ 

     Load-DataGridView $datagridview1 -Item $results 
     $OBJ = $null 
    } 
} 

function Update-DataGridView($VMName, $Status) { 
    $Update = $results | where { $_.VMName -eq $VMName } 
    Write-Host $Update 
    $Update.Status = "$Status" 
    [array]$results += $Update 

    Load-DataGridView $datagridview1 -Item $results 
} 

EDIT:

Function Create-Names 
{ 

    $namearray = @() 
    [int]$i = $RangeS.Text 
    [int]$e = $RangeE.Text 
    $e++ 
    $Prefix = $tPrefix.Text 
    do 
    { 
     $Suffix = "{0:000}" -f $i 
     $namearray += $Prefix + $Suffix 
     $i++ 
    } 
    until ($i -eq $e) 

    return $namearray 
} 

La fonction Update-DataGridView se fait à différentes parties quand je viens d'appeler pour définir l'état.

Voici le Load-DataGridView.

function Load-DataGridView 
{ 
    <# 
    .SYNOPSIS 
     This functions helps you load items into a DataGridView. 

    .DESCRIPTION 
     Use this function to dynamically load items into the DataGridView control. 

    .PARAMETER DataGridView 
     The DataGridView control you want to add items to. 

    .PARAMETER Item 
     The object or objects you wish to load into the DataGridView's items collection. 

    .PARAMETER DataMember 
     Sets the name of the list or table in the data source for which the DataGridView is displaying data. 

    #> 
    Param (
     [ValidateNotNull()] 
     [Parameter(Mandatory=$true)] 
     [System.Windows.Forms.DataGridView]$DataGridView, 
     [ValidateNotNull()] 
     [Parameter(Mandatory=$true)] 
     $Item, 
     [Parameter(Mandatory=$false)] 
     [string]$DataMember 
    ) 
    $DataGridView.SuspendLayout() 
    $DataGridView.DataMember = $DataMember 

    if ($Item -is [System.ComponentModel.IListSource]` 
    -or $Item -is [System.ComponentModel.IBindingList] -or $Item -is [System.ComponentModel.IBindingListView]) 
    { 
     $DataGridView.DataSource = $Item 
    } 
    else 
    { 
     $array = New-Object System.Collections.ArrayList 

     if ($Item -is [System.Collections.IList]) 
     { 
      $array.AddRange($Item) 
     } 
     else 
     { 
      $array.Add($Item) 
     } 
     $DataGridView.DataSource = $array 
    } 

    $DataGridView.ResumeLayout() 
} 
+0

Nous avons besoin de savoir comment la fonction est appelée pour pouvoir vous aider avec précision. De plus, nous aurions besoin de savoir ce que 'Load-DataGrid' est afin de dire pourquoi vous obtenez des doublons. – TheMadTechnician

+0

Message modifié avec les informations demandées. – Doug

Répondre

0

D'après ce que je comprends, ce que vous faites essentiellement de la fonction Update-Datagridview charge le datagridview avec un nouveau datasource entier.

Le comportement par défaut est de redessiner l'intégralité de datagridview et de remplir les données du nouveau datasource. Par conséquent, vous perdriez les données du chargement précédent.

Load-Datagridview ressemble à une fonction personnalisée et puisque nous n'avons pas de visibilité dans le fonctionnement interne de celui-ci, nous ne serions pas en mesure de commenter ce comportement. Mais je crois, quelque part à l'intérieur, il ferait quelque chose comme ceci: $datagridview.Datasource = $results

Donc, pour préserver les données existantes, c'est ce que vous faites.

Etape 1: Convertir votre table $results d'origine à un bon datatable avant d'afficher. Je crois que les forums Sapien peuvent vous connecter avec cette fonction. Cela donnera $results une propriété Primarykey. Étape 2: En supposant que vous avez une colonne dont les données resteront constantes dans toutes les mises à jour que vous effectuez, vous pouvez faire de cette colonne particulière une clé primaire. Cela servira de point de référence entre toutes les mises à jour que vous faites. Faites-le après la boucle foreach. Par exemple, il semblerait que votre colonne VMName puisse servir à cette fin. Pour définir la clé primaire: $results.primarykey = $results.Columns[0]Columns[0] est l'indice de la colonne correspondante de VMName (je suppose que c'était votre 1ère colonne)

Etape 3: Dans votre fonction update-datagridview, utilisez la méthode merge() au lieu de charger une nouvelle source de données.

Pour plus de clarté, disons que votre table de résultats mise à jour s'appelle $NewResults. N'oubliez pas de convertir cela en un Datatable approprié aussi.

Maintenant tout ce que vous avez à faire est de fusionner votre nouvelle source de données avec la source de données originale comme ci-dessous: $results.merge($NewResults) et votre datagridview aura les nouvelles mises à jour.

La méthode merge() comporte également des indicateurs supplémentaires. Peut-être que vous pouvez trouver la documentation de l'éditeur de Sapien. Par quelques essais et erreurs, j'ai constaté que cela fonctionnait pour moi. Je ne sais pas ce que les indicateurs signifient mais cela a résolu mon problème de duplication. REMARQUE: pour que la fusion fonctionne, le type de données des valeurs $NewResults doit correspondre au type de données $Results. J'ai converti toutes les valeurs à [string] pour le garder simple. Je sais, une façon horrible d'obtenir une sortie transparente.

+0

Cela fonctionne. Merci! Le seul problème que j'avais était de définir la clé primaire sur la table de données. Ma fusion fonctionne bien maintenant sans elle. – Doug

+0

Sans la clé primaire, vous courez le risque d'étendre votre table de données lorsque le système trouve une discordance entre les données de la datatable existante et la nouvelle datable. Mais je suis content que cela fonctionne pour vous. BUT!!! Veuillez considérer ceci comme la réponse. –