【问题标题】:Figure out the focused control找出重点控制
【发布时间】:2026-01-18 12:50:01
【问题描述】:

我正在尝试向控件添加一个 CSS 类,以便在呈现页面后获得焦点。虽然 Page 类的 SetFocus() 方法可以让我设置 Control,但没有对应的 GetFocus() 方法。

根据.Net 来源,信息存储在Page 类的私有成员_focusedControl 中。属性 FocusedControl 标记为内部。

有没有办法通过反射来获取私有成员或内部属性的值?

任何帮助将不胜感激。

说明: 这就是我要添加 CssClass 服务器端的原因:我正在尝试应用以下内容 jQuery 脚本,改变焦点元素的背景:

$(document).ready(function() {
  var elements = jQuery("textarea, select, multi-select, :text, :password, :file");

  elements.bind
  (
    'focus',
    function() {
      jQuery(this).addClass('highlightinput');
    }
  );

  elements.bind
  (
    'blur',
    function() {
      jQuery(this).removeClass('highlightinput');
    }
  );
})

只要我没有在我的 aspx.vb 中专门设置焦点控件,它就可以正常工作。如果我确实设置了一个焦点控件(我认为是由于时间问题),焦点是在我的处理程序附加到输入字段之前设置的,因此输入不会突出显示。所以我的方法是在呈现页面之前将 highlightinput 类添加到焦点控件。

【问题讨论】:

    标签: asp.net jquery vb.net reflection


    【解决方案1】:

    如果您正在寻找一种用于突出显示焦点元素的 CSS 解决方案,我相信您可以使用 ':focus' 选择器。我没有尝试过,但我相信这是一个有效的选择器。你可以在你的 css 文件中使用它:

    :focus{ background-color: yellow;}

    【讨论】:

    • 感谢 Yobi21,这在 Firefox 中运行良好,但 IE 不支持
    【解决方案2】:

    焦点控制可能在回传之间发生了变化,这就是为什么我认为你不能轻易找到它的原因。将每个控件的整个状态保留在 ViewState 中可能太昂贵了。

    也许您可以使用 javascript 在客户端的隐藏字段中跟踪哪个控件具有焦点,并在服务器上读取它。

    【讨论】:

    • 没错。但是,我不需要这些信息来在回发中生存。我只需要知道传递给 SetFocus 方法的最后一个控件。
    【解决方案3】:

    我不知道我是否正确理解了你的问题......

    难道你不能在服务器端添加一个 cssclass 来控制你的设置焦点吗?

    controlObj).CssClass = "highlightinput"
    Page.SetFocus(controlObj)
    

    【讨论】:

    • 问题是,Page.SetFocus 是由我无法控制的组件调用的。所以我想弄清楚,一旦页面被渲染,什么控件将被聚焦,这样我就可以设置额外的 CssClass。另外,我想有一个通用的方法,我可以添加到基类中
    【解决方案4】:

    为什么不全部通过 JavaScript 来完成呢?比如:

    body.onLoad = function() { document.activeElement.style.color = '#ff0000'}

    这可能有问题,但我认为这是一个好的开始。

    【讨论】:

    • 谢谢肖恩,我试过了,但我无法让它工作。我宁愿知道服务器端哪个控件将获得焦点。