【问题标题】:Detect Control User Clicked on During Other Controls OnChanged Event检测在其他控件 OnChanged 事件期间单击的控件用户
【发布时间】:2018-03-06 23:21:40
【问题描述】:

我有一个复杂的业务应用程序,用户希望我验证单个文本框条目。我正在使用 OnChanged 事件来触发 PostBack 并对各种其他字段值进行业务规则验证。问题是用户在文本框中键入一个值,然后单击另一个文本框。 OnChanged 事件按预期触发,但我很难获得他们点击的(不同的)控件。我尝试在其他控件的 OnFocus 事件中添加一些 Javascript,并将控件名称/ID 保存在隐藏字段中。我有一个测试警报,表明隐藏字段确实在 OnChanged 回发之前更新,但隐藏字段值在 OnChanged 回发中没有更新值。如果我做一些事情来触发 second 回发,那么隐藏字段就有值。

我要么需要让这个方法工作,要么可能有另一种解决方案来找到他们从其他控件的 OnChanged 事件中单击的控件。请帮忙。

请不要 jquery 建议;项目不允许使用 jquery。

【问题讨论】:

  • 作为一个实验,我将警报移至触发 OnChanged 事件回发的 javascript,正如预期的那样,隐藏字段值不存在。
  • 仍在努力,现在我有一个可行的解决方案,但我不喜欢它,而不是 OnFocus,我尝试了 OnMouseDown。这会在 OnChanged 之前触发,所以......丑陋......但如果你们中的一个大师想不出更漂亮的东西,我可能不得不接受它。

标签: javascript c# asp.net


【解决方案1】:

您可以在每个 TextBox 上添加一个 onFocusIn 侦听器。然后将焦点文本框的 ID 添加到 HiddenField 并在 PostBack 上读取。

<asp:TextBox ID="TextBox1" runat="server" OnTextChanged="TextBox_TextChanged" 
   onFocusIn="setFocusedControlValue(this)" AutoPostBack="true"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server" OnTextChanged="TextBox_TextChanged" 
    onFocusIn="setFocusedControlValue(this)" AutoPostBack="true"></asp:TextBox>

<asp:HiddenField ID="HiddenField1" runat="server" />

<script type="text/javascript">
    function setFocusedControlValue(control) {
        document.getElementById('<%=HiddenField1.ClientID %>').value = control.id;
    }
</script>

后面的代码

protected void TextBox_TextChanged(object sender, EventArgs e)
{
    Label1.Text = HiddenField1.Value;
}

然而,TextChanged 事件也会在点击页面上的其他任何位置时触发 PostBack,在这种情况下,您将没有下一个 TextBox 的 ID。

【讨论】:

  • 从 OnFocus 切换到 OnFocusIn 没有任何区别。但是,从 OnChange 切换到 TextChanged 成功了。所以看起来 OnChange 在 OnFocusIn 和 OnFocus 之前触发,但 TextChanged 出现在两者之后,这是有效的。顺便说一句,我了解事件触发顺序可能因浏览器而异,因此此解决方案可能不适用于每个人的业务应用程序。这里的环境是运行在quirksmode下的IE11。
  • 我使用了 FireFox,所以它可能适用于所有浏览器。如果它可以在 IE 中运行,那么它大部分时间都可以在任何其他浏览器中运行。
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 2011-04-27
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多