【问题标题】:OnTextChanged forcing me to click button twiceOnTextChanged 迫使我点击按钮两次
【发布时间】:2019-08-14 19:29:34
【问题描述】:

我正在开发一个 asp.net、c# 网络应用程序。我有一个文本框(带有验证器)定义为...

      <asp:TextBox ID="VehicleAmt" runat="server" AutoPostBack="True" 
   OnTextChanged="VehicleAmt_OnTextChanged" 
   causesvalidation="true"
   Width="35px"></asp:TextBox>
  <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" Font-Size="12px"
          ControlToValidate="VehicleAmt" ErrorMessage="*" ForeColor="#CC3300"
          SetFocusOnError="True" ValidationExpression="[0-99999]*" Display="Dynamic">
  </asp:RegularExpressionValidator>
  <asp:RequiredFieldValidator id="RequiredFieldValidatorVehicleAmt"
         ControlToValidate="VehicleAmt"
         Display="Dynamic"
         ErrorMessage="Required"
         runat="server"/>

在表单的其他地方,我有一个 Telerik RadGrid,最后一列是一个按钮。这被定义为...

    <telerik:GridTemplateColumn UniqueName="ActionColumn">
 <ItemTemplate>
  <asp:LinkButton Text="" runat="server" ID="lnkAddVehicle" CausesValidation="false" CommandName="AddVehicle">
   <img src="images/buttons/add.png"/>
  </asp:LinkButton>
 </ItemTemplate>

VehicleAmt_OnTextChanged 方法可以节省一些数据库。问题是当我在文本框中输入内容然后单击添加按钮时,我实际上必须单击按钮两次才能运行按钮代码。任何想法为什么会发生这种情况以及如何为此启用单击?

我确实注意到我有一个标准的 asp.net 按钮,单击一下似乎就可以了。

仅供参考:AddVehicle 的代码部分是这样的......

    protected void RadGridAvailableItems_ItemCommand(object source, Telerik.Web.UI.GridCommandEventArgs e)
{
    if (e.CommandName != "Sort" && e.CommandName != "Page" && e.CommandName != "ChangePageSize")
    {
        GridDataItem dataItem = e.Item as GridDataItem;

        int VehicleId = Convert.ToInt32(dataItem["VehicleId"].Text);

    switch (e.CommandName)
        {

            case "AddVehicle":
                :
                break;              
        }
    }
    rebindGrids();

    panErrorMessages.Visible = false;
}

【问题讨论】:

  • 可能是“AddVehicle”的邮政编码。对 from 的验证将分为两部分……一部分是客户端,另一部分是服务器端,因此请注意保持它们的完整性。不清楚 AddVehicle 是否使用表单数据。
  • @pcalkins 我为按钮添加了一些代码,以便您查看。但是,它甚至没有进入方法,直到我点击两次。
  • 好的,你可能有一个格式错误的 linkBut​​ton 标签。我不认为它是为那样使用而设计的……(不应该有结束标签)。如果图像将成为按钮,您可能只需要一个标准链接。
  • @pcalkins 我认为这不是问题所在。我已经这样用过很多次了。但谢谢你的想法! :)

标签: c# asp.net telerik telerik-grid radgrid


【解决方案1】:

AutoPostback 设置为"true",一旦文本框失去焦点,您的文本框就会触发TextChanged 事件 - 这包括尝试单击按钮。

看起来您必须单击按钮两次,但实际发生的是:-

  1. 你去点击一个按钮或将焦点设置到另一个控件

  2. 默认的 ASP.NET 客户端 javascript 发布表单,而您的 文本框的 TextChanged 事件触发

  3. 页面再次加载

  4. 您现在可以按下保存按钮(或将焦点移至另一个控件)而不会再次引发 TextChanged 事件

您可以通过附加调试器并在 TextChanged 事件中放置断点来验证这一点。

【讨论】:

  • 谢谢!任何解决方法,所以感知不是双击?
  • 如果可以避免,请不要在 TextChanged 中添加代码 - 收集 GridView 的内容并将其保存为单个批次,由单击“保存”按钮触发
  • 这是个好主意,但不幸的是工作流程不允许这样做。有2个网格。底部网格有所有可用的“添加”项目。顶部网格包含他们添加的内容,并且允许他们调整一些值。所以,我点击底部网格中的添加,然后他们在顶部网格中填充一些值,但在任何时候他们都可以在底部网格中再次单击添加按钮,而无需先保存。我不想丢失他们自定义的任何值。希望这是有道理的。 @sh1rts
  • 如果您必须立即保存顶部网格(包含订单产品和数量的网格),我建议使用 jQuery AJAX 将网格中的文本更改事件发布到 HttpHandler /跨度>
猜你喜欢
  • 2012-07-26
  • 2015-02-06
  • 1970-01-01
  • 2012-02-08
  • 2018-11-13
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多