更新面板textchanged问题asp.net c#
Posted
技术标签:
【中文标题】更新面板textchanged问题asp.net c#【英文标题】:Update panel textchanged problem asp.net c# 【发布时间】:2022-01-06 17:31:06 【问题描述】:离开文本框后,我希望它专注于下一个对象。或者我希望按钮在单击按钮时起作用。在我现在遇到的问题中,我在离开文本框后在 gif 中遇到了问题。
default.aspx
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
<ContentTemplate>
<div class="form-group row">
<label class="col-lg-2 col-form-label">İşlem Tutarı</label>
<div class="col-lg-4">
<asp:TextBox ID="txtTutar" CssClass="form-control form-control-sm price" AutoPostBack="true" placeholder="0,00 ₺" runat="server" OnTextChanged="txtTutar_TextChanged"></asp:TextBox>
</div>
</div>
<div class="form-group row">
<label class="col-lg-2 col-form-label">Tahsil Edilen Tutar</label>
<div class="col-lg-4">
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
<asp:TextBox ID="txtTahsilEdilen" AutoPostBack="true" CssClass="money form-control form-control-sm price" placeholder="0,00 ₺" runat="server" OnTextChanged="txtTahsilEdilen_TextChanged"></asp:TextBox>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="txtTutar" EventName="TextChanged" />
</Triggers>
</asp:UpdatePanel>
default.asp.cs
protected void txtTutar_TextChanged(object sender, EventArgs e)
txtTutar.Text = FormatMoney(decimal.Parse(txtTutar.Text));
txtTahsilEdilen.Text = txtTutar.Text;
【问题讨论】:
您已经被告知,触发您已经在其中的同一个更新面板是零意义的。并且此“txtTahsilEdilen.Text = txtTutar.Text;”的控件在哪里。您不能在代码后面更新更新面板之外的控件。要么发布更多标记,要么解释这个控件在页面上的位置/原因:“txtTahsilEdilen.Text = txtTutar.Text;” 我更新了问题。触发的对象已经在更新面板中。我希望将写入 UpdatePanel1 中名为 txtTutar 的对象中的值写入 UpdatePanel2 中名为 txtTahsilEdilen 的对象中。我可以做我想做的事。但是当我在txtTutar对象中输入数据后按“tab”键或点击页面上的任何对象时,我点击的对象没有焦点。 完整还是仅更新面板回帖?该标记到达服务器 - 后台代码运行,然后将更新面板的全新副本发送回客户端。就像任何网页回发一样,光标从第一个控件开始。您将不得不引入一个 control.Focus()。你大概可以点击两次,焦点是否出现?您的回帖是由于该点击,但实际上是由于文本更改事件。我会删除文本更改服务器端事件。您必须考虑使用 ajax 调用代替服务器端事件,并删除文本更改事件。 小惊喜。跳转到新控件的单击事件不是问题 - 事实上,文本更改会发回整个更新面板,因此您的单击甚至没有机会运行。当您单击新控件时,由于文本更改而回发。您必须真正转储该文本更改事件,因为如果它触发,则会发生面板的标准往返行程,运行代码背后的代码,并且面板的新副本会返回客户端。结果,您总是会丢失点击事件。 您在使用 ajaxToolkit - 它有一个货币输入掩码。另一个想法是使用 jQuery 插件来屏蔽资金输入。 【参考方案1】:我会做几件事中的一件。首先,发生回发(文本已更改),然后当您单击另一个控件时 - 理论上您必须单击两次。
因此,要么删除回发更改的文本,然后在完成后格式化数字。如果你真的希望在打字时发生这种情况,那么
如果您使用 ajax 控制工具包,这里有一个非常好的数字/货币格式化程序。
如果没有,那么考虑一个 jQuery 插件——它将消除对回发的需要,而您可以在客户端执行此操作。这里有一个非常好的 javascript 库:
https://robinherbots.github.io/Inputmask/
另一种简单的方法 - 可能是最省力的?
使用基于文本更改的 ajax 调用。这将允许您为一个文本框运行后面的代码,并且现在不会发生更新面板回发。
所以你可以像这样编写文本框:
<br />
<asp:TextBox ID="TextBox2" runat="server" onchange="fixnum(this)"
ClientIDMode="Static"
></asp:TextBox>
<script>
function fixnum(c)
tBox = $(c)
$.ajax(
type: "POST",
data: JSON.stringify( v: tBox.val() ),
contentType: "application/json;charset=utf-8",
dataType: "json",
async: true,
url: "WebForm4.aspx/curFormat",
success: function (MyReturn)
tBox.val(MyReturn.d);
,
failure: function ()
tBox.val("")
);
</script>
在网页中,我们有:
using System.Web.Services;
然后是一个公共网络方法,像这样说:
[WebMethod]
public static string curFormat(string v)
Debug.Print("web call");
v = String.Format("0:#,##0.00", double.Parse(v));
return v;
所以,现在当您输入一个数字并点击选项卡时 - 我们不会进行回发,而是会运行存根后面的代码。事实上,您可能会因此完全不需要更新面板。
【讨论】:
以上是关于更新面板textchanged问题asp.net c#的主要内容,如果未能解决你的问题,请参考以下文章