2017-06-01 1 views
1

diesen Code vor:Warum kann ich DialogResult eines Formulars nicht in einem Ereignishandler in PowerShell festlegen?

$Form = New-Object System.Windows.Forms.Form 

$YesButton = New-Object System.Windows.Forms.Button 
$YesButton.Text = "Yes" 

$YesButton.Location = New-Object System.Drawing.Point(` 
    (($Form.Width/2) - ($YesButton.Width)), 25) 

$YesButton.Add_Click({$Form.DialogResult=[System.Windows.Forms.DialogResult]::OK}) 

$NoButton = New-Object System.Windows.Forms.Button 
$NoButton.Text = "No" 

$NoButton.Location = New-Object System.Drawing.Point(` 
    ($YesButton.Location.X + $YesButton.Width + 10), $YesButton.Location.Y) 

$NoButton.Add_Click({$Form.DialogResult=[System.Windows.Forms.DialogResult]::Cancel}) 

$Form.Controls.Add($YesButton) 
$Form.Controls.Add($NoButton) 

$Timer = new-object System.Windows.Forms.Timer 

$Timer.Add_Tick(
{ 
    $Form.DialogResult = [System.Windows.Forms.DialogResult]::None 
    $Form.Close() 
}) 

$Timer.Interval = 3000 
$Timer.start() 

$Result = $Form.ShowDialog() 

if ($Result -eq "OK") 
{ 
    Write-Output "User selected 'Yes'." 
} 
elseif ($Result -eq "Cancel") 
{ 
    Write-Output "User selected 'No'." 
} 
elseif ($Result -eq "None") 
{ 
    Write-Output "User selected nothing; prompt timed out." 
} 

Wenn ich es laufen und der Timer-Tick lasse das Formular schließen, würde ich erwarten es die elseif ($Result -eq "None") und damit drucken User selected nothing; prompt timed out., schlagen, aber es wird stattdessen die elseif ($Result -eq "Cancel") und Druck User selected 'No'. schlagen

Warum tut es das, und wie bekomme ich es, um das gewünschte Dialog-Ergebnis zurückzugeben?

+0

Leider habe ich die alten Nachrichten an Ort und Stelle gelassen, wenn auf eine Übersetzung [MCVE]. Ich habe aktualisiert. Es trifft den zweiten Zweig '$ Result -eq" Cancel "' und ich frage mich, warum es nicht das dritte '$ Result -eq" None "' trifft. Siehe meine Aktualisierungen. –

+0

Es trifft den zweiten Zweig - 'elseif ($ Result -eq" Cancel ")'. Es bewertet nicht einmal den dritten Zweig, also ist es egal, was ich dort hineinlege. –

+0

Das ist nur, wenn der keine Knopf geklickt wird, was nicht ist, oder? Ich klicke nicht auf einen der beiden Buttons - Ja oder Nein. –

Antwort

3

Wenn der Timer das Formular schließt, wird DialogResult in None geändert, ABER dann wird unmittelbar danach $ Form.close() aufgerufen.

Da die Close() -Methode DialogResult auf Cancel setzt, wird durch Umschalten der Close() -Methode, bei der Sie DialogResult manuell ändern und den neuen Aufzählungswert in Abort ändern, die Bedingungen wie vorgesehen funktionieren.

+0

Danke für deine Antwort. Warum muss ich "Abort" verwenden? Warum funktioniert "None" nicht? (Ich habe getestet und bestätigt, dass das stimmt, ich weiß einfach nicht warum). –

+0

Keine ist der Wert von DialogResult, wenn das Fenster gerade geöffnet und nicht geschlossen ist. Im Wesentlichen heißt es: "Das Fenster ist gerade geöffnet und es gibt keine Zustandsänderung." Sie müssen Abort nicht wirklich verwenden; Sie könnten auch Ignorieren oder Nein verwenden. Sie müssen nur sicherstellen, dass Sie es auf einen Wert setzen, von dem Sie wissen, dass er nirgendwo anders im Skript eingestellt wird. –

+0

Vielen Dank für Ihre Hilfe. –

0

Wenn dies alles ist, was Sie wollen, ich würde es einfach halten und betrachten die alte Art und Weise zu verwenden WScript.Shell Popup:

$Result = (New-Object -ComObject WScript.Shell).Popup("Do you like to continue?", 3, "Title", (1 + 32 + 4096)) 
Verwandte Themen