2017-10-17 49 views
2

我正在尋找一個簡單的方法來檢查,如果一個文本框或日期選擇器已經改變了形式打開之前已經改變。如果確實存在,那麼運行存儲過程,否則只需跳過它並運行已經更改的那些存儲過程。檢查文本框或日期選擇器運行存儲過程C#

我有什麼:

internal static string oldAvgRate; 
internal static string oldOTRate; 
internal static string ratetype; 
internal static string ratetypeOT; 
private string UpdateRate(string dateFrom, string newRate, string oldRate, string ratetype, string description){ 
    string connectionString = "datasource=;port=;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 void btnSave_Click(object sender, RoutedEventArgs e) 
{ 
    oldAvgRate = UpdateRate(dfAvgR.SelectedDate.Value.ToString("yyyy-MM-dd"), txtAvgR.Text, oldAverageRate, ratetype, txtdescriptionAvgR.Text); 
    oldOTRate = UpdateRate(dfOTR.SelectedDate.Value.ToString("yyyy-MM-dd"), txtOTR.Text, oldOTRate, ratetypeOT, txtdescriptionOTR.Text); 
} 

例如:如果txtAvgR.Text和/或df.AvgR.Value已經改變,那麼運行oldAvgRate否則跳過並運行oldOTRate如果txtOTR.Text和/或df.OTR.Value已經改變別人不運行任何並顯示MessageBox(「Nothing has changed」)。

我該如何做到這一點?對我來說最好的辦法是什麼?謝謝。

更新基礎上的建議來自@ Picnic8和@Robert哈維:

XAML:

<TextBox x:Name="txtAvgR" TextChanged="textChangedEventHandler" IsEnabled="False"/> 
<TextBox x:Name="txtOTR" TextChanged="textChangedEventHandler" IsEnabled="False"/> 

C#:

private bool hasChangedFlag; 

// TextChangedEventHandler delegate method. 
private void textChangedEventHandler(object sender, TextChangedEventArgs args) 
{   
    hasChangedFlag = true; 
} 

private void btnSave_Click(object sender, RoutedEventArgs e) 
{ 
    if (hasChangedFlag) 
    { 
    oldAvgRate = UpdateRate(dfAvgR.SelectedDate.Value.ToString("yyyy-MM-dd"), txtAvgR.Text, oldAvgRate, ratetype, txtdescriptionAvgR.Text); 
    oldOTRate = UpdateRate(dfOTR.SelectedDate.Value.ToString("yyyy-MM-dd"), txtOTR.Text, oldOTRate, ratetypeOT, txtdescriptionOTR.Text); 
    MessageBox.Show("Done", "Test", MessageBoxButton.OK); 
    } 
    else 
    {  
    MessageBox.Show("Nothing has changed", "Test", MessageBoxButton.OK); 
     return; 
    } 
} 
+2

設置一個布爾標誌的'txtAvgR'和'dv.AvgR的'AfterUpdate'事件'。在你的'btnSave_Click'方法中檢查這個標誌。 –

+0

謝謝你的建議羅伯特。我不知道從哪裏開始,我仍然在學習。你能告訴我你會怎麼做嗎?我很感激。 – iCosmin

+1

是否沒有用於文本框text.changed的事件偵聽器模板?我建議有此text.changed事件監聽器設置一個標誌,你的btnSave指該標誌 https://msdn.microsoft.com/en-us/library/system.windows.forms.control.textchanged(v= vs.110).aspx –

回答

5

基於什麼@Robert哈維建議,這裏是實施國旗的一種方式。

在XAML修訂

private bool txtAvgRHasChangedFlag; 
private bool txtOTRRHasChangedFlag; 

// TextChangedEventHandler delegate method. 
private void textChangedEventHandler(object sender, TextChangedEventArgs args) 
{   
    var control = sender as TextBox; 

    if (control.Name == "txtAvgR") 
     txtAvgRHasChangedFlag = true; 
    else if (control.Name == "txtOTR") 
     txtOTRHasChangedFlag = true; 
} 

private void btnSave_Click(object sender, RoutedEventArgs e) 
{ 
    if (txtAvgRHasChangedFlag) 
    { 
     oldAvgRate = UpdateRate(dfAvgR.SelectedDate.Value.ToString("yyyy-MM-dd"), txtAvgR.Text, oldAvgRate, ratetype, txtdescriptionAvgR.Text); 
     MessageBox.Show("Done", "Test", MessageBoxButton.OK); 
    } 

    if (txtOTRRHasChangedFlag) 
    { 
     oldOTRate = UpdateRate(dfOTR.SelectedDate.Value.ToString("yyyy-MM-dd"), txtOTR.Text, oldOTRate, ratetypeOT, txtdescriptionOTR.Text); 
     MessageBox.Show("Done", "Test", MessageBoxButton.OK); 
    } 

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

現在只需引用此事件委託這樣

<TextBox x:Name="txtAvgR" TextChanged="textChangedEventHandler" IsEnabled="False"/> 
    <TextBox x:Name="txtOTR" TextChanged="textChangedEventHandler" IsEnabled="False"/> 
+0

非常棒的答案,謝謝你的幫助!這正是我所期待的。但是,它不起作用。儘管我遵循了你的建議,但當我保持不變時,兩個存儲過程都在btnSave_Click上運行。就像if語句不存在一樣。只有陳述的第一部分被執行。你能看到我更新的問題嗎?我究竟做錯了什麼? – iCosmin

+0

另外,我怎麼可以添加SelectionDateChanged的委託方法,並用它來根據你的榜樣一個datepicker? – iCosmin

+2

從我讀,創建TextBox控件和最初使用文本時,此事件。如果我沒看錯,這意味着你應該無視標誌分配在第一時間(當創建控件)把一個破發點的情況下方法內,並告訴我,如果它進入時,你只需啓動你的解決方案吧。如果是這樣,你剛發現的問題:) – Picnic8

相關問題