ここで間違っていることを特定するのは難しい時期です。私のロジックは、テキストボックスが変更された場合にのみ、ストアドプロシージャ(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に次のエラーに気づく:
私は本当に任意の提案をいただければ幸いです。ありがとうございました!
@ 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;
}
コードは、コンストラクタでこれらのボックスのTextプロパティを割り当てに偽確認する必要があり、そうboolsは常に真です。永遠に真実であるように、虚偽に戻ることのない兆候はありません。 –
ハンスのお手伝いをありがとうございます。これは私の問題の解決策のように思えます。どうすれば偽に戻すことができますか?私は例に感謝します。 – iCosmin
回答と解決策は問題には含まれません。これが価値のあるものだと思えば、答えとして投稿することができます。 –