Kategorie szkoleń | Egzaminy | Kontakt
  • 3
  • 1
  • 45

Witam.

Mam skrypt tworzący formularz. Pytanie dotyczy zmniejszenia ilości kodu. Mam 14 bloków sprawdzających checkbox'y typu:

$checkBox_1.Add_CheckStateChanged({
    if( $checkBox_1.Checked -or
        $checkBox_2.Checked -or
        $checkBox_3.Checked -or
        $checkBox_4.Checked -or
        $checkBox_5.Checked -or
        $checkBox_6.Checked -or
        $checkBox_7.Checked -or
        $checkBox_8.Checked -or
        $checkBox_9.Checked -or
        $checkBox_10.Checked -or
        $checkBox_11.Checked -or
        $checkBox_12.Checked -or
        $checkBox_13.Checked -or
        $checkBox_14.Checked ) {
        $okButton.Enabled = $True
    }
    else {
        $okButton.Enabled = $False
    }
})

...

Czy jest jakiś sposób na zapisanie tego w formie jednego bloku lub ze sprawdzeniem if'a w krótszej ilości linii?

Pozdrawiam.
Emil.

Emil_Krawczak
  • Zapytał
  • @ Emil_Krawczak | 23.08.2016
    • 0
    • 0
    • 0

Odpowiedzi (3)

  • 4

Zawsze można optymalizować np. przeglądając kolekcje kontrolek typu CheckBox konstrukcją foreach:

 $okButtonEnabled = $False
    foreach ($cb in $form1.Controls)
    {
        if($cb -is [System.Windows.Forms.CheckBox])
        {
          if(($cb -as [System.Windows.Forms.CheckBox]).Checked)
          {
            $okButtonEnabled = $True;
           break
          }
        }
    }

$okButton.Enabled = $okButtonEnabled

Zaletą takiego podejścia poza oczywistym skróceniem kodu jest zwiększenie utrzymywalności, czyli niższe koszty np. dodania kolejnej kontrolki typu CheckBox.

  • Odpowiedział
  • @ | 25.08.2016
  • TRENER ALTKOM AKADEMII
  • 0

Ok, o wiele lepsze podejście, ale mam jeszcze pytanie dotyczące zastosowania z .Add_CheckStateChanged(). Próbowałem na różne sposoby to zaimplementować, ale w każdej sytuacji formularz traci dynamiczną zmianę stanu. Przy starej metodzie sprawdzania wszystkich kontrolek  na zasadzie ta lub ta to wszystko działa bez zarzutu. Czy można prosić o jakąś poradę w związku ze zmianą statusu guzika OK w zależności od zaznaczonych checkboxów przy powyższej krótszej metodzie?

Emil_Krawczak
  • Odpowiedział
  • @ Emil_Krawczak | 30.08.2016
    • 0
    • 0
    • 0
  • 2

Kompletne rozwiązanie ze zdarzeniem CheckStateChanged:

function CheckBoxForm {

[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null

$form1 = New-Object System.Windows.Forms.Form
$button1 = New-Object System.Windows.Forms.Button
$listBox1 = New-Object System.Windows.Forms.ListBox
$checkBox3 = New-Object System.Windows.Forms.CheckBox
$checkBox2 = New-Object System.Windows.Forms.CheckBox
$checkBox1 = New-Object System.Windows.Forms.CheckBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState


$handler_button1_Click= 
{
    $listBox1.Items.Clear();    

    if ($checkBox1.Checked)     {  $listBox1.Items.Add( "Checkbox 1 is checked"  ) }

    if ($checkBox2.Checked)    {  $listBox1.Items.Add( "Checkbox 2 is checked"  ) }

    if ($checkBox3.Checked)    {  $listBox1.Items.Add( "Checkbox 3 is checked"  ) }

    if ( !$checkBox1.Checked -and !$checkBox2.Checked -and !$checkBox3.Checked ) {   $listBox1.Items.Add("No CheckBox selected....")} 

    $okButtonEnabled = $False
    foreach ($cb in $form1.Controls)
    {
        if($cb -is [System.Windows.Forms.CheckBox])
        {
          if(($cb -as [System.Windows.Forms.CheckBox]).Checked)
          {
            $okButtonEnabled = $True;
           break
          }
        }
        
    }
    $button1.Enabled = $okButtonEnabled
    $listBox1.Items.Add($okButtonEnabled)
    
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
    $form1.WindowState = $InitialFormWindowState
    foreach ($cb in $form1.Controls)
    {
        if($cb -is [System.Windows.Forms.CheckBox])
        {
            $cb.Add_CheckStateChanged($handler_button1_Click) 
        }
    }
}

#----------------------------------------------
#region Generated Form Code
$form1.Text = "CheckBoxform"
$form1.Name = "form1"
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 500
$System_Drawing_Size.Height = 300
$form1.ClientSize = $System_Drawing_Size

$button1.TabIndex = 4
$button1.Name = "button1"
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.Height = 23
$button1.Size = $System_Drawing_Size
$button1.UseVisualStyleBackColor = $True

$button1.Text = "OK"

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 27
$System_Drawing_Point.Y = 156
$button1.Location = $System_Drawing_Point
$button1.DataBindings.DefaultDataSourceUpdateMode = 0
$button1.add_Click($handler_button1_Click)
$button1.Enabled = $false
$form1.Controls.Add($button1)

$listBox1.FormattingEnabled = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 301
$System_Drawing_Size.Height = 212
$listBox1.Size = $System_Drawing_Size
$listBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$listBox1.Name = "listBox1"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 137
$System_Drawing_Point.Y = 13
$listBox1.Location = $System_Drawing_Point
$listBox1.TabIndex = 3

$form1.Controls.Add($listBox1)


$checkBox3.UseVisualStyleBackColor = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 104
$System_Drawing_Size.Height = 24
$checkBox3.Size = $System_Drawing_Size
$checkBox3.TabIndex = 2
$checkBox3.Text = "CheckBox 3"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 27
$System_Drawing_Point.Y = 75
$checkBox3.Location = $System_Drawing_Point
$checkBox3.DataBindings.DefaultDataSourceUpdateMode = 0
$checkBox3.Name = "checkBox3"


$form1.Controls.Add($checkBox3)


$checkBox2.UseVisualStyleBackColor = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 104
$System_Drawing_Size.Height = 24
$checkBox2.Size = $System_Drawing_Size
$checkBox2.TabIndex = 1
$checkBox2.Text = "CheckBox 2"
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 27
$System_Drawing_Point.Y = 44
$checkBox2.Location = $System_Drawing_Point
$checkBox2.DataBindings.DefaultDataSourceUpdateMode = 0
$checkBox2.Name = "checkBox2"

$form1.Controls.Add($checkBox2)



    $checkBox1.UseVisualStyleBackColor = $True
    $System_Drawing_Size = New-Object System.Drawing.Size
    $System_Drawing_Size.Width = 104
    $System_Drawing_Size.Height = 24
    $checkBox1.Size = $System_Drawing_Size
    $checkBox1.TabIndex = 0
    $checkBox1.Text = "CheckBox 1"
    $System_Drawing_Point = New-Object System.Drawing.Point
    $System_Drawing_Point.X = 27
    $System_Drawing_Point.Y = 13
    $checkBox1.Location = $System_Drawing_Point
    $checkBox1.DataBindings.DefaultDataSourceUpdateMode = 0
    $checkBox1.Name = "checkBox1"

$form1.Controls.Add($checkBox1)


#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
CheckBoxForm

 

  • Odpowiedział
  • @ | 31.08.2016
  • TRENER ALTKOM AKADEMII