2017-10-18 4 views
0

ここで間違っていることを特定するのは難しい時期です。私のロジックは、テキストボックスが変更された場合にのみ、ストアドプロシージャ(UpdateRate)を実行することです。テキストボックスに変更がない場合は、その情報行のストアドプロシージャをスキップして、次の情報に移動します。テキストボックスが変更されたときにTextChangedEventが発生しない

誰かがこれを理解するのを手伝ってもらえますか?私はすべてを試しました。私はこれでは新しく、複雑な答えを完全に理解していないかもしれないことに留意してください。

の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"/> 

私は解決策を開始し、if文にbtnSave_Click内部の内部2つのブレークポイントを設定して、テキストボックス、予告の1を変更私が何をしても、どちらの文もTrueになります。テキストボックスを無効にして保存ボタンをクリックしても、私はまだFalseの代わりにTrueを取得します。私はデバッグしようとすると、私は変更のテキストボックスの1のために、TextChangedEventに次のエラーに気づく:

enter image description here

私は本当に任意の提案をいただければ幸いです。ありがとうございました!

@ user2107843回答に基づく試行。これは私の初期の問題を解決しますが、2回目の保存をクリックすると、変更されたものだけでなく、両方のストアドプロシージャが実行されます。したがって、txtAHWを変更してからsaveをクリックすると、txtAHWのストアドプロシージャが実行されます。その直後にtxtOHWも変更した場合、ストアドプロシージャはtxtOHWだけを実行する代わりに両方のために実行されます。ここで私のロジックは、txtAHWは既に保存されているので、再度実行する必要はありません。いくつかの助け私はこれを改善することができます:

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

コードは、コンストラクタでこれらのボックスのTextプロパティを割り当てに偽確認する必要があり、そうboolsは常に真です。永遠に真実であるように、虚偽に戻ることのない兆候はありません。 –

+0

ハンスのお手伝いをありがとうございます。これは私の問題の解決策のように思えます。どうすれば偽に戻すことができますか?私は例に感謝します。 – iCosmin

+1

回答と解決策は問題には含まれません。これが価値のあるものだと思えば、答えとして投稿することができます。 –

答えて

0

をあなたは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

ありがとうございました。それは正しいアプローチのように見えます。しかし、私はまだ変更がない場合でも真のブールを得る。私はそれを得ていない。あなたは何が起こっているのかアドバイスできますか? – iCosmin

+1

初めてtrueになるのは、oldAvgRateが初めてnullになるからです。textChangedEventHandlerが最初に評価されるため、null条件チェックが行われます。 if(oldAvgRate!= txtAHW.Text && oldAvgRate!= null) – user2107843

+0

これはすばらしい助けになる!本当にありがとう、私は最終的にこれの底になったとは思えません。本当に役立つもう一つのことがあり、私はあなたの助けに感謝するでしょう... – iCosmin

関連する問題