更新面板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#的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 在更新面板更新时显示“正在加载...”消息

更新面板 AJAX asp.net 后运行脚本

异步更新 ASP.NET 面板

Asp.net 按钮 onclick 在更新面板中不起作用

ASP.Net 文件上传导致使用触发器在更新面板中回发

从放置在更新面板外部的控件触发 asp.net 事件