【问题标题】:"How to Prevent multiple events C#?"“如何防止多个事件 C#?”
【发布时间】:2019-10-31 16:08:33
【问题描述】:

我在更新面板中有带有 auto postback = "true" 的文本框控件,当我将某些内容更改为文本框并且如果用户按下 "Alt + s" 时不会失去焦点,还有带有访问键 "Alt + s" 的保存按钮而不是需要调用文本框的第一个文本更改事件,然后应该触发一次保存单击事件,因为对文本更改事件进行了一些计算。在这种情况下,它首先触发文本更改事件,而不是调用保存单击事件,然后再次调用文本更改事件。

有没有什么好的方法来解决客户端或服务器端或从 sql 端的问题?

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
 <ContentTemplate>

<asp:TextBox ID="Txt_Val" runat="server" AutoPostBack="True"                                
 OnTextChanged="Txt_Val_TextChanged"></asp:TextBox>

<asp:Button ID="Btn_Save"  runat="server" OnClick="Btn_Save_Click" 
Text="Save" AccessKey="S" ValidationGroup="S"/>

</ContentTemplate>
  </asp:UpdatePanel>

   protected void Btn_Save_Click(object sender, EventArgs e)
   {
      //Save data into database
   }

  protected void Txt_Val_TextChanged(object sender, EventArgs e)
  {
       // Some calculation
  }

【问题讨论】:

  • 不如将您的操作绑定到eventstext_changedSave_click 创建单独的方法,您可以从事件以及外部调用它们(为您ALT+S 的情况。)。

标签: c# jquery sql asp.net


【解决方案1】:

解决方案 1: Microsoft 在此处https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.update?view=netframework-4.8 提供了 Control.Update 方法文档。它在数据库中的最后一次更新值存储。

解决方案 2: 请检查您的事件是否有其他事件调用,然后有时会出现此问题。

解决方案 3: 您在页面加载事件中更新值后设置焦点

protected void Page_Load(object sender, EventArgs e)
{
    TextBox1.Focus();
}

第二次设置焦点,更新后是此问题的第三次解决方案。

希望以上三个解决方案对你有帮助。

【讨论】:

  • 我不能使用解决方案 3:因为有多个文本框自动回发 = true 并且在这种情况下用户没有离开文本框只是他更改文本框中的值并按“Alt + s”解决方案 1:这是网页,所以我不能使用 Control.update 这个问题就像你在解决方案 2 中提到的那样出现,但它的问题不是解决方案
  • 是的,我明白了,但是你在数据库中保存了一个值,并且在保存时间焦点隐藏在文本框上,所以,我建议你下次更新值然后文本框焦点。
【解决方案2】:

当我将某些内容更改为文本框并且如果用户按下“Alt + s”而不失去焦点时,则需要调用文本框的第一个文本更改事件,然后应该触发一次保存单击事件,因为对文本更改事件进行了一些计算

引用的语句也可以这样处理:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
 <ContentTemplate>

<asp:TextBox ID="Txt_Val" runat="server" AutoPostBack="True"                                
 OnTextChanged="Txt_Val_TextChanged"></asp:TextBox>

<asp:Button ID="Btn_Save"  runat="server" OnClick="Btn_Save_Click" 
Text="Save" AccessKey="S" ValidationGroup="S" OnClientClick="return verifyFirst();" />

</ContentTemplate>
  </asp:UpdatePanel>

<script>
function verifyFirst(){
   return verifyChangedText($('[id$=Txt_Val]'));
}

function verifyChangedText(elem){
    //verify your stuff on client level.
    //if you need to do the server side stuff, hit WebMethod using ajax
    //finally according to the result
    if(everythingIsOk){
      return true;
    }
    return false;
}  
</script>

onClientClick 首先在客户端执行,如果一切都令人满意,则返回 bool 值,如果为 true,则执行服务器端事件调用 OnClick="Btn_Save_Click",如果为 false,则不执行服务器端事件调用。

更新

对于每个文本框控件,我在页面或网格中有多个带有文本更改事件的文本框,这将很难处理

根据您上面引用的评论,您可以处理多个 TextBox 验证 但只能通过以下方式处理:

如果用户在没有集中注意力的情况下按下回车,那么我们不知道哪个 TextBox 用户对哪个 TextBox 进行了更改,因此我们必须检查表单中存在的所有 TextBox 并触发每个 TextBox 的 onkeypress 事件。

例如:

i = 0;
function verifyMe(event,args){
    debugger;
    $(args).text(i += 1);
  };
  
function verifyThisStuff(){
	var e = jQuery.Event("keypress");
   $('.forVerification').each(function(){
		$(this).trigger(e); 
   });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" class="forVerification" onkeypress="return verifyMe(event,'#span1');">
<input type="text" class="forVerification" onkeypress="return verifyMe(event,'#span2');">
<button type="button" onclick="return verifyThisStuff();">click Me</button>

<p>textbox 1 Keypresses: <span id="span1">0</span></p>

<p>textbox 2 Keypresses: <span id="span2">0</span></p>

【讨论】:

  • 我在页面或网格中有多个文本框,每个文本框控件都带有文本更改事件,这将很难处理
  • 我按照上面的代码试过了,但还是不行
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多