2017-10-18 19 views
0

J'ai du mal à identifier ce que je fais de mal ici. Ma logique consiste à exécuter la procédure stockée (UpdateRate) uniquement si une zone de texte change. S'il n'y a pas de changement dans la zone de texte, ignorez simplement la procédure stockée pour cette ligne d'informations et passez à la suivante.TextChangedEvent ne se déclenche pas lorsque le textbox change ou non

Est-ce que quelqu'un peut m'aider à comprendre cela? J'ai tout essayé. Gardez à l'esprit que je suis nouveau dans ce domaine et que je ne comprendrai peut-être pas complètement les réponses compliquées.

C#:

public partial class MainWindow : 
{ 
    internal static string oldAvgRate; 
    internal static string oldOTRate; 
    internal static string ratetype; 
    internal static string rtOT; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     string connectionString = "datasource=;port=;username=;password="; 
     string sDate = DateTime.Now.ToString("yyyy-MM-dd"); 
     MySqlConnection connection = new MySqlConnection(connectionString); 

     MySqlCommand avgRate = new MySqlCommand("Select ID, DateFrom, DateTo, RateType, Amount, Description from Daily.Rates where RateType = 'Average Hourly Wages' and DateTo >= @sDate", connection); 
     avgRate.Parameters.Add(new MySqlParameter("sDate", sDate)); 

     MySqlCommand otRate = new MySqlCommand("Select ID, DateFrom, DateTo, RateType, Amount, Description from Daily.Rates where RateType = 'Average OT Hourly Wages' and DateTo >= @sDate", connection); 
     otRate.Parameters.Add(new MySqlParameter("sDate", sDate)); 

     try 
     { 
      connection.Open(); 

      MySqlDataReader AvgR = avgRate.ExecuteReader(); 

      while (AvgR.Read()) 
      { 
       txtAHW.Text = AvgR["Amount"].ToString(); 
       dfAHW.Text = AvgR["DateFrom"].ToString(); 
       dtAHW.Text = AvgR["DateTo"].ToString(); 
       txtcommAHW.Text = AvgR["Description"].ToString(); 

       oldAvgRate = txtAHW.Text = AvgR["Amount"].ToString(); 
       ratetype = AvgR["RateType"].ToString(); 
      } 

      AvgR.Close(); 
      AvgR.Dispose(); 

      MySqlDataReader OtR = otRate.ExecuteReader(); 

      while (OtR.Read()) 
      { 
       txtOTHW.Text = OtR["Amount"].ToString(); 
       dfOTHW.Text = OtR["DateFrom"].ToString(); 
       dtOTHW.Text = OtR["DateTo"].ToString(); 
       txtcommOTHW.Text = OtR["Description"].ToString(); 

       oldOTRate = txtOTHW.Text = OtR["Amount"].ToString(); 
       rtOT = OtR["RateType"].ToString(); 
      } 

      OtR.Close(); 
      OtR.Dispose(); 
     } 

     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

     connection.Close(); 
    } 

     private string UpdateRate(string dateFrom, string newRate, string oldRate, string ratetype, string description) 
     { 
      string connectionString = "datasource=;port=;Initial Catalog='';username=;password="; 
      MySqlConnection connection = new MySqlConnection(connectionString); 

      try 
      { 
       connection.Open(); 

       MySqlCommand cmd = new MySqlCommand("UpdateRate", connection); 
       cmd.CommandType = CommandType.StoredProcedure; 
       cmd.Parameters.Add("@p_DateFrom", MySqlDbType.Date).Value = dateFrom; 
       cmd.Parameters.Add("@p_NewAmount", MySqlDbType.Decimal).Value = newRate; 
       cmd.Parameters.Add("@p_OldAmount", MySqlDbType.Decimal).Value = oldRate; 
       cmd.Parameters.Add("@p_RateType", MySqlDbType.VarChar).Value = ratetype; 
       cmd.Parameters.Add("@p_Description", MySqlDbType.VarChar).Value = description; 

       cmd.ExecuteNonQuery();    
       connection.Close(); 
       return newRate;    
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      return null; 
     } 

     private bool txtAHWHasChangedFlag; 
     private bool txtOTHWHasChangedFlag; 

     private void textChangedEventHandler(object sender, TextChangedEventArgs args) 
     {   
      var control = sender as TextBox; 

      if (control.Name == "txtAHW") 
       txtAHWHasChangedFlag = true; 
      else if (control.Name == "txtOTHW") 
       txtOTHWHasChangedFlag = true; 
     } 

     private void btnSave_Click(object sender, RoutedEventArgs e) 
     { 
      if (txtAHWHasChangedFlag) //True regardless if changes are made in the textbox or not :(
      { 
      oldAvgRate = UpdateRate(dfAHW.SelectedDate.Value.ToString("yyyy-MM-dd"), txtAHW.Text, oldAvgRate, ratetype, txtcommAHW.Text); 
      MessageBox.Show("Done", "Test", MessageBoxButton.OK); 
      } 

      if (txtOTHWHasChangedFlag) //True regardless if changes are made in the textbox or not :(
      { 
      oldOTRate = UpdateRate(dfOTHW.SelectedDate.Value.ToString("yyyy-MM-dd"), txtOTHW.Text, oldOTRate, rtOT, txtcommOTHW.Text); 
      MessageBox.Show("Done", "Test", MessageBoxButton.OK); 
      } 

      if (!txtAHWHasChangedFlag && !txtOTHWHasChangedFlag) 
      {  
      MessageBox.Show("Nothing has changed", "Test", MessageBoxButton.OK); 
      return; 
      } 
     } 
} 

XAML:

<TextBox x:Name="txtAHW" TextChanged="textChangedEventHandler"/> 
<TextBox x:Name="txtOTHW" TextChanged="textChangedEventHandler"/> 

J'ai mis 2 points d'arrêt à l'intérieur à l'intérieur btnSave_Click sur les instructions if, a commencé la solution, a changé l'un des champs de saisie et avis que quoi que je fasse, les deux instructions aboutissent à True. Même si je désactive mes boîtes de texte et que je clique sur le bouton Enregistrer, je reçois toujours True au lieu de False. Lorsque je tente de déboguer je remarque l'erreur suivante sur le TextChangedEvent, pour l'une des zones de texte que je change:

enter image description here

Je voudrais vraiment apprécier toute suggestion. Je vous remercie!

Tentative basée sur la réponse @ user2107843. Il résout mon problème initial, mais lorsque je clique sur Enregistrer la deuxième fois, il exécute les deux procédures stockées au lieu de seulement celle qui a changé. Donc, si je change txtAHW et puis cliquez sur Enregistrer, cela fonctionne, il exécute uniquement la procédure stockée pour txtAHW. Si juste après cela, je change aussi txtOHW, la procédure stockée s'exécute pour les deux à la place de ne s'exécuter que pour txtOHW. Ma logique ici est que txtAHW a déjà été sauvegardé, donc pas besoin de recommencer. l'aide peut me améliorer ceci:

private void textChangedEventHandler(object sender, TextChangedEventArgs args) 
{   
    var control = sender as TextBox; 

    if (control.Name == "txtAHW") 

     if (oldAvgRate != txtAHW.Text && oldAvgRate != null) 
      txtAHWHasChangedFlag = true; 
     else 
      txtAHWHasChangedFlag = false; 
    else if (control.Name == "txtOTHW") 
     if (oldOTRate != txtOTHW.Text && oldOTRate != null) 
      txtOTHWHasChangedFlag = true; 
     else 
      txtOTHWHasChangedFlag = false; 
} 
+1

Le code attribue la propriété Text de ces boîtes dans le constructeur, de sorte que les bools sont toujours vraies. Aucun signe de replonger dans le faux, alors ils sont vrais pour toujours. –

+0

Merci pour votre aide Hans. Cela ressemble à la solution à mon problème. Pouvez-vous s'il vous plaît me montrer comment puis-je les remettre à faux? Je serais reconnaissant pour un exemple. – iCosmin

+1

Les réponses et les solutions n'appartiennent pas à la question. Si vous pensez que cela vaut la peine de rester, vous pouvez le poster comme une réponse à la place. –

Répondre

0

Vous devriez faire de faux dans textChangedEventHandler

private void textChangedEventHandler(object sender, TextChangedEventArgs args) 
     {   
      var control = sender as TextBox; 

      if (control.Name == "txtAHW") 

       if(oldAvgRate != txtAHW.Text && oldAvgRate !=null) 
        txtAHWHasChangedFlag = true; 
       else 
        txtAHWHasChangedFlag = false 
      else if (control.Name == "txtOTHW") 
       txtOTHWHasChangedFlag = true; 
     } 
+0

Merci pour votre aide. Cela ressemble à la bonne approche. Cependant, je reçois toujours le booléen Vrai même s'il n'y a aucun changement. Je ne comprends pas. Pouvez-vous s'il vous plaît conseiller sur ce qui pourrait se passer? – iCosmin

+1

la première fois que vous obtiendrez true, car oldAvgRate sera null pour la première fois. Puisque textChangedEventHandler sera évalué en premier.aussi une vérification de condition null. if (oldAvgRate! = txtAHW.Text && oldAvgRate! = null) – user2107843

+0

Ceci est une aide formidable !!! Merci beaucoup, je n'arrive pas à croire que nous ayons finalement compris. Il y a encore une chose qui serait vraiment utile et je vous serais reconnaissant pour votre aide ... – iCosmin