2016-02-15 16 views
5

Mam pola tekstowe i przycisk.Jak mogę się upewnić, że zdarzenie textchanged w polu tekstowym jest uruchamiane przed zdarzeniem kliknięcia przycisku?

Przycisk używa wartości, która jest manipulowana przez zdarzenie textchanged w polu tekstowym.

Nie chcę, aby zdarzenie kliknięcia przycisku było uruchamiane przed zmianą wartości w przypadku zdarzenia zmienionego w polu tekstowym.

void tprice_TextChanged(object sender, EventArgs e) { 
     idtextbox tsender = (idtextbox)sender; 
     decimal value = 0; 
     decimal.TryParse(tsender.Text, out value); 
     if (area_updates.ContainsKey(tsender.id)) { area_updates[tsender.id].price = value; } 
     else { area_updates.Add(tsender.id, new area_update(tsender.id) { price = value }); } 
     Session["area_updates"] = area_updates; 
    } 

protected void bsave_Click(object sender, EventArgs e) { 

    } 
+1

Jak kod wyglądać? 'TextBox_TextChanged' i' Button_Click' są już domyślnie oddzielnymi zdarzeniami – Ian

+0

Możesz użyć zmiennej flag (ViewState) ustawić jej wartość w textchanged i użyć flagi do zmiany w zdarzeniu click button, a także zresetować wartość, jeśli chcesz – Adil

+0

@Ian pytanie jest aktualizowany –

Odpowiedz

1

AFAIK nie ma sposobu, aby zapewnić kolejność zdarzeń TextChanged ->ButtonClick. Powinieneś zastosować inne podejście.

  1. Przenieś logiki TextChanged w przypadku ButtonClick lub
  2. Dokonać TextBoxAutoPostBack=true, ale wymaga to dodatkowego odświeżenie

więc proponuję umieścić logikę do ButtonClick - i usunąć TextChanged wydarzenie.

+0

również moje pola tekstowe są programowo tworzone w pętli. powtarzanie ich i sprawdzanie, czy są zmienione, wydaje się obecnie kosztowne obliczeniowo. tahnks i tak –

+0

@ UğurGümüşhan: Nie rozumiem, co jest drogie. Nie masz miliardów pól tekstowych, więc ilość pracy powinna być znikoma –

1

EDIT: Według innego komentarza, który wykonany, jeśli pola tekstowe są dodawane i usuwane programowo można również utworzyć niestandardową kontrolę użytkownika ze swoim przycisku i tekstowym, i wdrożyć tę logikę, to programowo dodać, że kontrola użytkownika. Jest to jeden przycisk, a pole tekstowe będzie ze sobą powiązane i nie będzie znało innych. Nie jestem pewien kontekst, w którym chcesz to zrobić, więc to podejście może nie być najlepsze.


Użyj flagi textboxIsDirty, którą ustawisz i zmienisz w dwóch procedur obsługi zdarzeń.

private bool tpriceIsDirty = false; 

void tprice_TextChanged(object sender, EventArgs e) { 
    tpriceIsDirty = true; 
    // Do work 
} 

protected void bsave_Click(object sender, EventArgs e) { 
    if (tpriceIsDirty) 
    { 
     tpriceIsDirty = false; 
     // Do work 
    } 
} 

Jak zasugerowano w innej odpowiedzi, chciałbym również wykonać bieżącą logikę, którą posiadasz w metodzie TextChanged w metodzie Click. Można jednak powiązać flagę tpriceIsDirty z właściwością bsave.Enabled w celu całkowitego wyłączenia przycisku, jeśli pole tekstowe pozostanie niezmienione. Jest ładniejszy z punktu widzenia UX. :)

Edycja: jak na komentarz, który można wprowadzić, można również dodawać i usuwać programy obsługi zdarzeń w locie. Zmiana tego podejścia może być dla ciebie korzystna.

void tprice_TextChanged(object sender, EventArgs e) { 
    if (bsave.Click == null) 
    { 
     bsave.Click += bsave_Click; 
    } 

    .... 
} 

protected void bsave_Click(object sender, EventArgs e) { 
    bsave.Click = null; 
} 
0

Ja osobiście wolę nie mieć kodu takiego w większości moich programów obsługi zdarzeń. Naprawdę, przy zapisie prawdopodobnie mógłbyś pobrać wartości do analizy tekstu i zrobić to tam, jeśli potrzebujesz. Możesz również oznaczyć właściwości jako zmienione na obiektach, z którymi pracujesz i zaktualizować je tak, jak robią to inne rzeczy, takie jak zamknięcie formularza lub anulowanie, lub nawet licznik czasu, jeśli obawiasz się utraty danych. Ale to tylko moja opinia.

Aby rozwiązać problem, który można rozwiązać, można dodać procedurę obsługi zdarzeń dla zdarzenia Leave z textbox. Aby kliknąć przycisk zapisu, musisz najpierw opuścić pole tekstowe, więc być może będziesz mógł tam wykonać swoją logikę analizowania.

0

Tak, to możliwe ... wystarczy spojrzeć na poniższe rozwiązanie .. Jest to w zasadzie a trick created using javascript, ale wystarczające ..

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    <script> 
     function EnsureNoSubmit(txt) { 
      //alert('Ensured no submit');//test cases 
      document.getElementById('<%=hdn.ClientID%>').value = false; 
     } 

     function isOkToSubmit() { 
      var needSubmit = document.getElementById('<%=hdn.ClientID%>').value;    
      //if (needSubmit != '') {alert('No Submit now');}else {alert('Ok with Submit');}//test cases 
      return needSubmit == ''; 
     } 

     function MakeSureSubmit() { 
      //alert('no submit revoked');//test cases 
      document.getElementById('<%=hdn.ClientID%>').value = ''; 
     } 

    </script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <div> 
      <asp:HiddenField runat="server" ID="hdn" /> 
      <asp:TextBox AutoPostBack="true" runat="server" ID="txt" onchange="EnsureNoSubmit();" OnTextChanged="txt_TextChanged"></asp:TextBox> 
      <asp:Button Text="Click Me" ID="btnClickMe" OnClientClick="return isOkToSubmit();" OnClick="btnClickMe_Click" runat="server" /> 
     </div> 
    </form> 
</body> 
</html> 

I na kodzie za strony dodać tylko jedna linia

protected void txt_TextChanged(object sender, EventArgs e) 
{ 
    //Your code is here 
    Page.ClientScript.RegisterStartupScript(this.GetType(),"Anything","MakeSureSubmit();",true); 
} 

Będzie pracy !!

Powiązane problemy