You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

System.Windows.Forms.TabPage的add_LostFocus与add_GotFocus失效问题

问题分析与解决方法

你的问题出在错误绑定了TabPage的焦点事件:Windows Forms中,切换TabControl的标签页时,TabPage的GotFocus和LostFocus事件并不会触发——因为焦点实际属于TabControl或其内部的子控件,而非TabPage本身,所以这两个事件永远不会被调用,导致按钮状态始终不变。

正确的做法是监听TabControl的SelectedIndexChanged事件,通过判断当前选中的标签页来控制按钮的显示/隐藏:

修改后的完整代码

$form           = New-Object system.Windows.Forms.Form
$form.ClientSize    = New-Object System.Drawing.Point(350,380)
$form.text      = "Form"

$tabcontrol         = New-object System.Windows.Forms.TabControl
$tabcontrol.Size    = New-Object System.Drawing.Size(330,330)
$tabcontrol.Location    = New-Object System.Drawing.Point(10,10)
$form.Controls.Add($tabcontrol)

$tab0                         = New-object System.Windows.Forms.Tabpage
$tab0.DataBindings.DefaultDataSourceUpdateMode    = 0
$tab0.UseVisualStyleBackColor             = $True
$tab0.Text                    = "Tab0"
$tab0.AutoScroll                  = $true
$tabcontrol.Controls.Add($tab0)

$add_button           = New-Object System.Windows.Forms.Button
$add_button.Size      = New-Object System.Drawing.Size(23,23)
$add_button.Location  = New-Object System.Drawing.Point(10,350)
$add_button.Text      = "+"
$form.Controls.Add($add_button)

$remove_button            = New-Object System.Windows.Forms.Button
$remove_button.Size       = New-Object System.Drawing.Size(23,23)
$remove_button.Location   = New-Object System.Drawing.Point(43,350)
$remove_button.Text       = "-"
$form.Controls.Add($remove_button)

# 初始状态:默认选中Tab0,显示按钮;如果默认不是Tab0则隐藏
if ($tabcontrol.SelectedIndex -eq 0) {
    $add_button.Show()
    $remove_button.Show()
} else {
    $add_button.Hide()
    $remove_button.Hide()
}

# 监听TabControl的选中项变化事件
$tabcontrol.add_SelectedIndexChanged({
    if ($tabcontrol.SelectedTab -eq $tab0) {
        $add_button.Show()
        $remove_button.Show()
    } else {
        $add_button.Hide()
        $remove_button.Hide()
    }
})

$tab1                         = New-object System.Windows.Forms.Tabpage
$tab1.DataBindings.DefaultDataSourceUpdateMode    = 0
$tab1.UseVisualStyleBackColor             = $True
$tab1.Text                    = "Tab1"
$tabcontrol.Controls.Add($tab1)

# 显示窗体(原代码遗漏了这行,否则窗体不会弹出)
$form.ShowDialog() | Out-Null

关键修改说明

  • 移除了$tab0的GotFocus和LostFocus事件绑定
  • 添加tabcontrol的SelectedIndexChanged事件处理逻辑,通过SelectedTab判断当前选中的是否是$tab0,以此控制按钮的显示状态
  • 增加了初始状态判断,确保窗体启动时按钮状态符合预期
  • 补充了$form.ShowDialog(),否则窗体无法正常显示

内容的提问来源于stack exchange,提问作者jerdub1993

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:05:22