2012-06-05 2 views
0

У меня есть событие _TextChanged, который работает должным образом, кроме как в конкретных обстоятельствах, которые могут быть воспроизведены следующим образом:TextChanged событие не срабатывает, когда вторая модификация равна первоначальную стоимость

  1. Пользователя изменяет текст (событие срабатывает правильно)
  2. Пользователь изменяет текст еще раз, чтобы соответствовать первоначальной стоимости (событие не срабатывает)

я могу получить событие _TextChanged работать на моем окне развития путем включения ViewState для панели обновления на странице ASCX, но когда я переношу его на сервер. Я получаю сообщение об ошибке, вызванное ошибкой в ​​представлении, если я переключаю пользовательские элементы управления, а затем переключаюсь обратно на эту страницу. Элементы управления, которые входят в панель обновления, динамически строятся в коде позади и перестраиваются с каждой обратной записью - это работает для любой другой обратной передачи, поэтому я не думаю, что проблема связана с элементами управления.

Кроме того, включение viewstate заставляет страницу работать ужасно медленно, так что это не будет идеальным решением.

И наконец, событие _TextChanged работает для всех изменений за исключением при возврате к исходному значению.

Может ли кто-нибудь сказать мне, почему событие не срабатывает в этом конкретном случае и как решить проблему?

создание текстового поля в коде позади:

TextBox annualHoursTextBox = new TextBox(); 
annualHoursTextBox.ID = string.Format("bundle{0}_annualHoursTextBox{1}", bundle.BundleNbr, parentItem.LaborItemNbr); 
annualHoursTextBox.CssClass = ""; 
annualHoursTextBox.Columns = 4; 
annualHoursTextBox.Text = childItem == null ? string.Empty : childItem.FTEHours.ToString("F0"); 
annualHoursTextBox.AutoPostBack = true; 
annualHoursTextBox.TextChanged += new EventHandler(annualHoursTextBox_TextChanged); 

AsyncPostBackTrigger AHtrigger = new AsyncPostBackTrigger(); 
AHtrigger.ControlID = annualHoursTextBox.UniqueID; 
AHtrigger.EventName = "TextChanged"; 
upPricingSheet.Triggers.Add(AHtrigger); 

//snip 

//add some attributes for reference on the events 
annualHoursTextBox.Attributes["othercontrol"] = tasksPerYearTextBox.UniqueID; 
annualHoursTextBox.Attributes["nextcontrol"] = benefitsTextBox.UniqueID; 
annualHoursTextBox.Attributes["targetTBcontrol"] = taskTimeTextBox.UniqueID; 
annualHoursTextBox.Attributes["targetDDLcontrol"] = taskTimeUOMDropDown.UniqueID; 

обработчика событий:

protected void annualHoursTextBox_TextChanged(object sender, EventArgs e) 
{ 
    TextBox ah = sender as TextBox; 
    TextBox other = Page.FindControl(ah.Attributes["othercontrol"]) as TextBox; 

    if ((!String.IsNullOrEmpty(ah.Text)) && (!String.IsNullOrEmpty(other.Text))) 
    { 
     TextBox next = Page.FindControl(ah.Attributes["nextcontrol"]) as TextBox; 
     TextBox targetTB = Page.FindControl(ah.Attributes["targetTBcontrol"]) as TextBox; 
     DropDownList ddl = Page.FindControl(ah.Attributes["targetDDLcontrol"]) as DropDownList; 
     Double TasksPerSecond; 

     TasksPerSecond = CalculateTimePerTask(ah.Text, other.Text); 
     string TimeUnit; 
     double Time; 

     if (TasksPerSecond < 60) 
     { 
      TimeUnit = "Seconds"; 
      Time = TasksPerSecond; 
     } 
     else if (TasksPerSecond < 3600) 
     { 
      TimeUnit = "Minutes"; 
      Time = (TasksPerSecond/60); 
     } 
     else 
     { 
      TimeUnit = "Hours"; 
      Time = (TasksPerSecond/60/60); 
     } 

     //Enter the time in the appropriate textbox 
     targetTB.Text = Time.ToString("F2"); 

     //select the appropriate item from the ddl 
     ListItem i = ddl.Items.FindByText(TimeUnit); 

     if (i != null) 
     { 
      ddl.SelectedItem.Selected = false; 
      i.Selected = true; 
     } 
    } 
} 

ASPX страницы:

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" 
AutoEventWireup="true" CodeFile="Solution.aspx.cs" Inherits="Solution" %> 

<%@ Register Src="fragments/solutionRecommended.ascx" TagName="solutionRecommended" 
TagPrefix="uc1" %> 
<%@ Register Src="fragments/solutionPricingSheet.ascx" TagName="solutionPricingSheet" 
TagPrefix="uc2" %> 
<%@ Register Src="fragments/solutionSuggested.ascx" TagName="solutionSuggested" TagPrefix="uc3" %> 
<%@ Register Src="fragments/solutionSummary.ascx" TagName="solutionSummary" TagPrefix="uc4" %> 
<%@ Register Src="fragments/ucItemFilterSearch.ascx" TagName="ucItemFilterSearch" 
TagPrefix="uc5" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server"> 
<script type="text/javascript"> 
    function addItemToBundle(postUrl, redirectUrl) { 
     $.post(postUrl); 
     window.location = redirectUrl; 
     // window.location = url; 
    } 

</script> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> 
<asp:HiddenField ID="hfStepNbr" runat="server" /> 
<asp:Panel ID="pnlStepMessage" runat="server" Visible="false" CssClass="padding10"> 
    <h3 class="placeholder"> 
     <asp:Label ID="lblMessage" runat="server" /></h3> 
</asp:Panel> 
<div class='elev8form' id="mainDiv" runat="server"> 
    <h3 class='header'> 
     Solutions</h3> 
    <div id="tabs"> 
     <div class='tab'> 
      <asp:LinkButton ID="lbSuggested" runat="server" Text="Select Items" data-step="1" 
       OnClick="lbTab_Click" CausesValidation="false"></asp:LinkButton> 
     </div> 
     <div class='tab'> 
      <asp:LinkButton ID="lbPricing" runat="server" Text="Pricing Worksheet" data-step="2" 
       OnClick="lbTab_Click" ></asp:LinkButton> 
     </div> 
     <div class='tab'> 
      <asp:LinkButton ID="lbRecommendedSolutions" runat="server" Text="Recommended Solutions" 
       data-step="3" OnClick="lbTab_Click" CausesValidation="false"></asp:LinkButton> 
     </div> 
     <div class='tab'> 
      <asp:LinkButton ID="lbSummary" runat="server" Text="Solutions Summary" data-step="4" 
       OnClick="lbTab_Click" CausesValidation="false"></asp:LinkButton> 
     </div> 
    </div> 
    <div id="solutions-body"> 
     <asp:MultiView ID="mltSolution" runat="server"> 
      <asp:View ID="viewSuggested" runat="server"> 
       <uc3:solutionSuggested ID="solutionSuggested1" runat="server" RedirectUrl="~/portal/elev8/solution.aspx" /> 
      </asp:View> 
      <asp:View ID="viewPricing" runat="server"> 
       <uc2:solutionPricingSheet ID="solutionPricingSheet1" runat="server" /> 
      </asp:View> 
      <asp:View ID="viewRecommended" runat="server"> 
       <uc1:solutionRecommended ID="solutionRecommended1" runat="server" /> 
      </asp:View> 
      <asp:View ID="viewSummary" runat="server"> 
       <p style="font-size: 14px;"> 
        Text here 
       </p> 
       <uc4:solutionSummary ID="solutionSummary1" runat="server" /> 
      </asp:View> 
     </asp:MultiView> 
    </div> 
</div> 
<script type="text/javascript"> 
    function pageLoad() { 
     $(function() { 

      var maxChannelHeight; 

      var items = $('.channel'); 

      for (var counter = 0; counter < items.length; counter++) { 
       var channel = items[counter]; 

       var channelHeight = $(channel).height(); 

       maxChannelHeight = maxChannelHeight > channelHeight ? maxChannelHeight : channelHeight; 
      } 

      $('.channel').height(maxChannelHeight); 

      $("#priceing-sheet-save-button *").click(function() { 
       window.scrollTo(0, 0); 

      }); 
     }); 
    } 

</script> 

ASCX Страница:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="solutionPricingSheet.ascx.cs" 
Inherits="solutionPricingSheet" %> 

<asp:UpdateProgress ID="upProgressRecSolution" runat='server' AssociatedUpdatePanelID="upPricingSheet"> 
<ProgressTemplate> 
    <div style="position: absolute; z-index: 2000; left: 45%; display: inline; width: 100px;" 
     class="elev8form"> 
     <asp:Image ID="Image1" runat='server' ImageUrl="~/portal/img/ajax-loader-big.gif" /> 
    </div> 
</ProgressTemplate> 
</asp:UpdateProgress> 
<div id="pricing-sheet-wrapper"> 
<p class='left'> 
    More text</p> 
<asp:Panel ID="pnlSaveMessage" runat="server" Visible="false" CssClass="save-message"> 
    <span>Item prices saved</span> 
</asp:Panel> 
<div class='export'> 
    <span class='bigbutton'> 
     <asp:LinkButton ID="btnExport" runat='server' Text="Export to Excel" OnClick="btnExport_Click" /> 
    </span> 
</div> 
<asp:UpdatePanel ID="upPricingSheet" runat="server" UpdateMode="Conditional" ViewStateMode="Disabled"> 
    <ContentTemplate> 
     <div id="pricing-sheet">   
      <asp:PlaceHolder ID="phContent" runat="server"></asp:PlaceHolder> 
      <asp:PlaceHolder ID="opportunityPlaceHolder" runat="server" /> 
      <div class='save export'> 
       <div> 
        <div id="pageValidationError" class="validationMessage"> 
         * Changes not saved. Review all entries for validation messages. Required fields marked with an asterisk. 
        </div> 
       </div> 
       <%--<asp:HiddenField ID="hf" runat="server" value="0" />--%> 
       <center> 
        <span id="priceing-sheet-save-button"> 
        <asp:Button ID="btnSave" runat="server" Text="Save All Prices" SkinID="redbutton" 
         OnClick="btnSave_Click" CausesValidation="true" /> 
        </span> 
       </center> 
      </div> 
     </div> 
     <script type="text/javascript"> 
      function pageLoad() { 

       $("#tabs .tab a").click(function() { 
        $("#<%= btnSave.ClientID%>").click(); 
       }); 
      } 
     </script> 
    </ContentTemplate> 
</asp:UpdatePanel> 
</div> 
    <script type="text/javascript"> 
$(document).ready(function() { 
    $('.validationMessage').hide(); 

    $('#<%= btnSave.ClientID %>').click(function() { 
     if (Page_IsValid == false) { 
      $('.validationMessage').show(); 
      return false; 
     } 
    }); 

    $('input[type=text]').blur(function() { 
     if (Page_IsValid == false) { 
      $('.validationMessage').show(); 
      return false; 
     } 
     else { 
      $('.validationMessage').hide(); 
     } 
    }) 
}); 

+0

Добавлено asp.net тег – Paparazzi

+0

Добро пожаловать на SO. Я не стану -1, поскольку вы новый член, но ваш вопрос не помогает вообще. Вы бросаете какой-то большой код, который даже не содержит часть, о которой вы говорите, проблема, или, по крайней мере, я не могу ее найти. Я провожу много времени и все еще не могу найти, где проблема, в линии ведьмы. Пожалуйста, покажите только часть вашего кода, имеющую эту проблему, и сосредоточьтесь на реальной проблеме. Я думаю, что вы даже не знаете, что делает этот код. «TextChanged» вообще отсутствует в вашем коде. – Aristos

+0

@Aristos - Я знаю, что я не публиковал событие _TextChanged, потому что он работает. Только при точных обстоятельствах, которые я изложил выше, это не работает, поэтому ошибка находится где-то в другом месте. Но я добавил к исходному сообщению только для проверки. –

ответ

1

То есть предполагаемое поведение - это событие называется OnTextChanged (отличается от оригинала) не OnTextTyped (любой текст, введенный), для этого вам придется обрабатывать это событие (которое вызывает даже если вообще ничего все вошли):

OnBlur="__doPostBack(this.id, '');"

UPDATE: его довольно просто на самом деле, так как вы используете Ajax, ваше текстовое поле .defaultValue-х не меняется между постбэков, только .value это - так либо использовать OnBlur как я говорил вам, или на каждом постбэка изменить .defaultValue к .value в JavaScript: http://www.w3schools.com/jsref/prop_text_defaultvalue.asp

или просто поместить текстовое поле в UpdatePanel, и он будет заботиться о нем себя на его своя...

UPDATE 2: Во-первых, нигде в коде не является текстовое поле показано, что внутри `UpdatePanel», а во-вторых, у вас есть 3 варианта:

а) Для OnBlur метод работы, удалить AutoPostBack свойство (это сторона клиента OnChange), но сохраните событие OnTextChanged (это серверная сторона).

б) Для ViewState метод работы, установите ViewStateMode="Enabled" на текстовое поле, и убедитесь, что вы используете ViewStateMode="Disabled" на своих контейнерах - и не EnableViewState="False".

с) Javascript .defaultValue метод ...

+0

Спасибо, но текст изменился. Пользователь не идет от «foo» до «foo», а скорее от «foo» до «bar», «bar» и «stuff», а затем «stuff» to «foo» - событие запускается каждый раз, когда он должен - пока пользователь не вернется к «foo». Почти идентичный метод работает на другой странице; просто не на этом. –

+0

@NicoleCastle имеет текст, но атрибут value имеет ** не **, я обновил ответ с разъяснениями для вас ... –

+0

Он уже * есть * на панели обновления - но, как упоминалось выше, viewstate выключен и не может быть включен. Мы также не смогли правильно запустить событие OnBlur. Я попробую другой вариант, который вы упомянули. –

Смежные вопросы