springstil
Goto Top

Powershell CheckedListbox Einträge verbergen

Hallo zusammen,

ich bin gerade dabei mir ein Skript zusammen zu basteln was mir Arbeit abnimmt. Mein Skript funktioniert soweit sehr gut, nur bin ich am überlegen dies etwas zu erweitern.

Die Funktion dahinter ist das es unsere Kataloge verschicken soll mit einem festen Text. Da sich die Kataloge aber auch ändern, nutze ich dafür eine Conf Datei in der ich Variablen pflege:

Ohne= Fuer eine Preisliste wenden sie sich bitte an ihren zuständigen Handelsvertreter. Vielen dank'  
Brutto= Brutto 123'  
Netto= Netto 123'  
SNetto= Snetto 123'  
beschreibung_Katalog1= Sommer Fruehjahr 2054: 
beschreibung_Katalog2= Herbst Fruehjahr 2054: 
beschreibung_Katalog3=
beschreibung_Katalog4=
beschreibung_Katalog5=
Katalog1= https://my.hidrive.com/lnk/O0CojJEr
Katalog2= Link 2
Katalog3= 
Katalog4= 
Katalog5= 

Bis jetzt versendet er einfach alle Kataloge. Nun möchte ich das aber so abändern das ich auswählen kann WELCHE er versenden soll. Entweder würde ich das mit einer Checklistbox oder Checklist machen. Den Namen des jeweiligen Katalogs Steuer ich per Variable was soweit auch Funktioniert.... ABER :D wenn es zur zeit nur 2 von 5 Kataloge gibt, sieht das dann so aus:

download

Nun zu meiner eigentlichen Frage, gibt es die Möglichkeit wenn es KEINEN wert hinter der Variable gibt, die Checkbox auszublenden?

Ich kann damit umgehen, aber wenn ich das auf der Messe laufen habe und ein Handelsvertreter von uns soll das bedienen sehe ich schon die riesigen Fragezeichen über seinem Kopf stehen.

Content-ID: 3551376374

Url: https://administrator.de/contentid/3551376374

Ausgedruckt am: 21.11.2024 um 20:11 Uhr

em-pie
Lösung em-pie 05.08.2022 um 09:22:31 Uhr
Goto Top
Moin,

du kannst Bilder auch direkt hier hochladen. Dazu im Editor das letzte Icon auswählen.


Zum Problem.
if (-not beschreibung_Katalog3 = '') {  
 $Form.Controls.Add($checkbox3) 
}

Gruß
em-pie
Springstil
Springstil 05.08.2022 um 10:28:38 Uhr
Goto Top
Zitat von @em-pie:

Moin,

du kannst Bilder auch direkt hier hochladen. Dazu im Editor das letzte Icon auswählen.


Zum Problem.
if (-not beschreibung_Katalog3 = '') {  
 $Form.Controls.Add($checkbox3) 
}

Gruß
em-pie

Danke, mit not hat es zwar nicht geklappt aber der Ansatz war gut :D

if ($beschreibung_Katalog1 -eq '') {} else { [void]$checkedlistbox1.Items.Add("$beschreibung_Katalog1") }

so klappt es dann auch Dankeschön face-smile
colinardo
Lösung colinardo 05.08.2022 aktualisiert um 11:17:31 Uhr
Goto Top
Servus @Springstil .
Ich würde die Config ja gleich as XML ablegen, damit lässt sich effizienter arbeiten.
Die XML ist hier im Beispiel jetzt direkt im Code hinterlegt (zum Ausprobieren), im Real-Life importierst du die ja aus einer Datei.
[xml]$config = @'  
<?xml version="1.0" encoding="utf-8"?>  
<config>
    <catalogs>
        <catalog url="https://domain.tld/catalog1.pdf">Katalog 1</catalog>  
        <catalog url="https://domain.tld/catalog2.pdf">Katalog 2</catalog>  
        <catalog url="https://domain.tld/catalog3.pdf">Katalog 3</catalog>  
        <catalog url="https://domain.tld/catalog4.pdf">Katalog 4</catalog>  
    </catalogs>
</config>
'@  

function GenerateForm {
    Add-Type -A System.Windows.Forms

    $form = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '200,200'  
        Text = "Checked-Listbox"  
    }
    
    $listbox = New-Object System.Windows.Forms.CheckedListBox -P @{
        Location = '10,10'  
        Size = '180,150'  
        Anchor = 'Top,Right,Bottom,Left'  
        CheckOnClick = $true
    }
    $btn = New-Object System.Windows.Forms.Button -P @{
        Location = '10,160'  
        Size = '180,30'  
        Text = 'Get checked'  
        Anchor = 'Bottom,Left,Right'  
        add_Click = {
            $catalog_links = $config.config.catalogs.catalog | ?{$_.innerText -in $listbox.CheckedItems} | %{$_.url}
            [System.Windows.Forms.MessageBox]::Show(($catalog_links -join "`n"),"Checked catalogs",0,32)  
            
        }
    }
    $listbox.Items.AddRange(@($config.config.catalogs.catalog.innerText))

    $form.Controls.AddRange(@($listbox,$btn))
    [void]$form.ShowDialog()
    
}
GenerateForm

Geht aber natürlich auch in dem Format was du jetzt hast, die Anzahl der Katalog ist auch hier beliebig erweiterbar ohne den Code anpassen zu müssen
$config = @'  
beschreibung_Katalog1 = Sommer Fruehjahr 2054: 
beschreibung_Katalog2 = Herbst Fruehjahr 2054: 
beschreibung_Katalog3 =
beschreibung_Katalog4 =
beschreibung_Katalog5 =
Katalog1 = https://my.hidrive.com/lnk/O0CojJEr
Katalog2 = Link 2
Katalog3 =
Katalog4 =
Katalog5 =
'@ |  ConvertFrom-StringData  


function GenerateForm {
    Add-Type -A System.Windows.Forms

    $form = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '200,200'  
        Text = "Checked-Listbox"  
    }
    
    $listbox = New-Object System.Windows.Forms.CheckedListBox -P @{
        Location = '10,10'  
        Size = '180,150'  
        Anchor = 'Top,Right,Bottom,Left'  
        CheckOnClick = $true
    }
    $btn = New-Object System.Windows.Forms.Button -P @{
        Location = '10,160'  
        Size = '180,30'  
        Text = 'Get checked'  
        Anchor = 'Bottom,Left,Right'  
        add_Click = {
            $catalog_links = $config.GetEnumerator() | ?{$_.Value -in $listbox.CheckedItems} | %{$config."Katalog$([regex]::match($_.Key,'\d+$').Value)"}  
            [System.Windows.Forms.MessageBox]::Show(($catalog_links -join "`n"),"Checked catalogs",0,32)  
            
        }
    }
    $listbox.Items.AddRange(@($config.GetEnumerator() | ?{$_.Name -match '^beschreibung_Katalog\d+$' -and $_.Value.trim() -ne ''} | %{$_.Value}))  
    $form.Controls.AddRange(@($listbox,$btn))
    [void]$form.ShowDialog()
    
}
GenerateForm

Vielleicht findest du ja ein paar Schnippsel mit denen du dein Skript etwas aufpeppen kannst face-wink.

Grüße Uwe
Springstil
Springstil 05.08.2022 um 12:18:49 Uhr
Goto Top
Zitat von @colinardo:

Servus @Springstil .
Ich würde die Config ja gleich as XML ablegen, damit lässt sich effizienter arbeiten.
Die XML ist hier im Beispiel jetzt direkt im Code hinterlegt (zum Ausprobieren), im Real-Life importierst du die ja aus einer Datei.
[xml]$config = @'  
<?xml version="1.0" encoding="utf-8"?>  
<config>
    <catalogs>
        <catalog url="https://domain.tld/catalog1.pdf">Katalog 1</catalog>  
        <catalog url="https://domain.tld/catalog2.pdf">Katalog 2</catalog>  
        <catalog url="https://domain.tld/catalog3.pdf">Katalog 3</catalog>  
        <catalog url="https://domain.tld/catalog4.pdf">Katalog 4</catalog>  
    </catalogs>
</config>
'@  

function GenerateForm {
    Add-Type -A System.Windows.Forms

    $form = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '200,200'  
        Text = "Checked-Listbox"  
    }
    
    $listbox = New-Object System.Windows.Forms.CheckedListBox -P @{
        Location = '10,10'  
        Size = '180,150'  
        Anchor = 'Top,Right,Bottom,Left'  
        CheckOnClick = $true
    }
    $btn = New-Object System.Windows.Forms.Button -P @{
        Location = '10,160'  
        Size = '180,30'  
        Text = 'Get checked'  
        Anchor = 'Bottom,Left,Right'  
        add_Click = {
            $catalog_links = $config.config.catalogs.catalog | ?{$_.innerText -in $listbox.CheckedItems} | %{$_.url}
            [System.Windows.Forms.MessageBox]::Show(($catalog_links -join "`n"),"Checked catalogs",0,32)  
            
        }
    }
    $listbox.Items.AddRange(@($config.config.catalogs.catalog.innerText))

    $form.Controls.AddRange(@($listbox,$btn))
    [void]$form.ShowDialog()
    
}
GenerateForm

Geht aber natürlich auch in dem Format was du jetzt hast, die Anzahl der Katalog ist auch hier beliebig erweiterbar ohne den Code anpassen zu müssen
$config = @'  
beschreibung_Katalog1 = Sommer Fruehjahr 2054: 
beschreibung_Katalog2 = Herbst Fruehjahr 2054: 
beschreibung_Katalog3 =
beschreibung_Katalog4 =
beschreibung_Katalog5 =
Katalog1 = https://my.hidrive.com/lnk/O0CojJEr
Katalog2 = Link 2
Katalog3 =
Katalog4 =
Katalog5 =
'@ |  ConvertFrom-StringData  


function GenerateForm {
    Add-Type -A System.Windows.Forms

    $form = New-Object System.Windows.Forms.Form -P @{
        ClientSize = '200,200'  
        Text = "Checked-Listbox"  
    }
    
    $listbox = New-Object System.Windows.Forms.CheckedListBox -P @{
        Location = '10,10'  
        Size = '180,150'  
        Anchor = 'Top,Right,Bottom,Left'  
        CheckOnClick = $true
    }
    $btn = New-Object System.Windows.Forms.Button -P @{
        Location = '10,160'  
        Size = '180,30'  
        Text = 'Get checked'  
        Anchor = 'Bottom,Left,Right'  
        add_Click = {
            $catalog_links = $config.GetEnumerator() | ?{$_.Value -in $listbox.CheckedItems} | %{$config."Katalog$([regex]::match($_.Key,'\d+$').Value)"}  
            [System.Windows.Forms.MessageBox]::Show(($catalog_links -join "`n"),"Checked catalogs",0,32)  
            
        }
    }
    $listbox.Items.AddRange(@($config.GetEnumerator() | ?{$_.Name -match '^beschreibung_Katalog\d+$' -and $_.Value.trim() -ne ''} | %{$_.Value}))  
    $form.Controls.AddRange(@($listbox,$btn))
    [void]$form.ShowDialog()
    
}
GenerateForm

Vielleicht findest du ja ein paar Schnippsel mit denen du dein Skript etwas aufpeppen kannst face-wink.

Grüße Uwe

Die erste Variante gefällt mir richtig gut! Hab mir grade nen HowTo durchgelesen was die XML config angeht. Denke das hab ich verstanden. Und werde ich vermutlich auch direkt umbauen.

Mit dem kompletten Schnipsel von dir versuche ich gerade klar zu kommen und zu verstehen was da passiert und werd es mal versuchen mit bei mir einzubauen, denn die art und weise gefällt mir sehr gut. Danke !!