PowerShell WinForms按钮点击事件重复执行问题求助
PowerShell GUI按钮点击事件重复执行问题解决
问题原因
你每次点击$Button1时,都会执行$OKButton16.add_Click(...)为该按钮添加一个新的点击事件处理器。多次点击$Button1后,$OKButton16上会绑定多个相同的事件,导致点击它时触发所有绑定的事件,代码执行次数等于点击$Button1的次数。
解决方案
方案1:提前绑定事件(推荐)
将$OKButton16的点击事件绑定逻辑移到$Button1的点击事件外部,仅在初始化$OKButton16时绑定一次事件,避免重复绑定。
# 提前初始化OKButton16并绑定点击事件(仅执行一次) $OKButton16 = New-Object System.Windows.Forms.Button # 补充OKButton16的其他初始化配置(如Text、Location等) $OKButton16.add_Click({ $ConsoleTextbox.AppendText("More text appended") Invoke-Command -ComputerName $Mycomputer -Credential $Credentials -ScriptBlock {Restart-Service -Name "*spool*" -Force} -AsJob -JobName JOB1 $ConsoleTextbox.AppendText("`n") $ConsoleTextbox.AppendText("Appending more text") $ConsoleTextbox.AppendText("`n") $ConsoleTextbox.AppendText("`n") $main_form.Controls.Remove($OKButton16) $main_form.Controls.Remove($CancelButton) $Button1.Enabled = $true }) # 初始化Button1及其点击事件 $Button1 = New-Object System.Windows.Forms.Button $Button1.Text = 'Computername' $Button1.Location = New-Object System.Drawing.Point(30,70) $Button1.Size = New-Object System.Drawing.Size(130,65) $Button1.add_Click({ $Button1.Enabled = $False $ConsoleTextbox.Text = "" # 原代码$ConsoleTextbox.Text = cls错误,改为空字符串清空文本框 $ConsoleTextbox.AppendText("My text appended") $main_form.Controls.Add($OKButton16) $main_form.Controls.Add($CancelButton) })
方案2:绑定前移除旧事件
如果必须在$Button1的点击事件内绑定$OKButton16的事件,可先移除已存在的事件处理器,再添加新的。需要将事件处理器定义为变量,方便后续移除。
$Button1 = New-Object System.Windows.Forms.Button $Button1.Text = 'Computername' $Button1.Location = New-Object System.Drawing.Point(30,70) $Button1.Size = New-Object System.Drawing.Size(130,65) # 定义OK按钮的事件处理器变量 $okClickHandler = { $ConsoleTextbox.AppendText("More text appended") Invoke-Command -ComputerName $Mycomputer -Credential $Credentials -ScriptBlock {Restart-Service -Name "*spool*" -Force} -AsJob -JobName JOB1 $ConsoleTextbox.AppendText("`n") $ConsoleTextbox.AppendText("Appending more text") $ConsoleTextbox.AppendText("`n") $ConsoleTextbox.AppendText("`n") $main_form.Controls.Remove($OKButton16) $main_form.Controls.Remove($CancelButton) $Button1.Enabled = $true # 执行后移除自身事件,防止后续误触发 $OKButton16.remove_Click($okClickHandler) } $Button1.add_Click({ $Button1.Enabled = $False $ConsoleTextbox.Text = "" $ConsoleTextbox.AppendText("My text appended") # 尝试移除旧事件,无旧事件时忽略错误 try { $OKButton16.remove_Click($okClickHandler) } catch {} # 绑定新事件 $OKButton16.add_Click($okClickHandler) $main_form.Controls.Add($OKButton16) $main_form.Controls.Add($CancelButton) })
额外修正
原代码中$ConsoleTextbox.Text = cls是错误用法,cls是PowerShell清屏命令,清空文本框内容应直接赋值为空字符串""。
内容的提问来源于stack exchange,提问作者Ruben M S
相关产品推荐
相关产品推荐

