[PoSh/.NET/C#] Best practice voor mijn filter

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

Topicstarter
Alhoewel PowerShell niet voor GUI bedoeld is ben ik er toch mee aan de slag gegaan, aangezien de andere sysadmins dit soort tools blijkbaar liever gebruiken als het een GUI is dan een shell script.

Het huidige script is een script dat op alle servers en virtuele machines kijkt welke sessies er bestaan (via de opensource cassia.dll, voor de geïnteresseerden). Dit alles wordt in een DataGridView gestoken en vervolgens wil ik de gebruiker de mogelijkheid geven om te filteren.

Op momenten als deze merk ik dat ik een echte programmeerachtergrond ontbeer: wat is de efficiëntste methode om deze filters toe te passen?

Eerst een screenshotje:
Afbeeldingslocatie: http://tweakers.net/ext/f/pAk8FmU3Gtasqni3eXv1M3es/full.jpg
Let niet op het bericht in de statusbalk, dat was wat spielerei van mijnentwege.

Er zijn vier filters die een waarde 1 of 0 kunnen hebben. Daarnaast is er een tekstinvoervak dat we op dezelfde manier kunnen beschouwen (dwz. is er invoer ja/nee). Dat betekent dat er 5² mogelijke combinaties zijn voor mijn filters.

Toen ik enkel nog het onderscheid maakte tussen Active en Disconnected viel het nog mee:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    If (($cbxShowActive.CheckState -EQ 1) -And ($cbxShowDisconnected.CheckState -EQ 0))
        {
        $script:FilteredConnections = $AllConnections | Where-Object {$_.ConnectionState -EQ "Active"}
        }
    ElseIf (($cbxShowActive.CheckState -EQ 0) -And ($cbxShowDisconnected.CheckState -EQ 1))
        {
        $script:FilteredConnections = $AllConnections | Where-Object {$_.ConnectionState -EQ "Disconnected"}
        }
    ElseIf (($cbxShowActive.CheckState -EQ 1) -And ($cbxShowDisconnected.CheckState -EQ 1))
        {
        $script:FilteredConnections = $AllConnections
        }
    ElseIf (($cbxShowActive.CheckState -EQ 0) -And ($cbxShowDisconnected.CheckState -EQ 0))
        {
        $boxStatus.Text = "Completely useless query ignored."
        $script:FilteredConnections = $AllConnections
        }
    Else
        {
        $script:FilteredConnections = $AllConnections
        }


Door het toevoegen van een filter op MachineType en op UserAccount zou de If-ElseIf-constructie al helemaal monsterlijk worden. Ik hoor graag elegantere oplossingen voor dit van mensen met meer ervaring dan mezelf :)

Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

Dit lijkt me een typisch probleem dat is op te lossen met het 'Pipes and Filters' design pattern (http://www.eaipatterns.com/PipesAndFilters.html). Maar omdat je niet al te ervaren bent met programmeren zou je ook een soort 'poor-mans pipes and filters' kunnen doen.

Omdat ik niet zo sterk ben in de syntax van VB, gebruik ik even C# notatie.

Ik neem aan dat je een model hebt voor de DataGridView dat er ongeveer zo uit ziet:

C#:
1
2
3
4
5
public class User 
{
    public string Username {get; set;}
    public bool IsActive {get; set;}
}


Dan kun je een lijst als volgt wel sorteren, hoe het zich vervolgt laat zich wel raden denk ik ;).

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var allUsers = <je lijst met alle gebruikers>
var showActive = (waarde van show active check box)
var userNameFilter = (waarde van 'username' textbox)

if(showActive) 
{
    allUsers = allUsers.Where(x => x.IsActive);
}

if(! string.IsNullOrWhiteSpace(userNameFilter)) 
{
    allUsers = allUsers.Where(x => x.Username.Contains(userNameFilter);
}

//Display allUsers lijst in je DataGridView