2017-10-17 42 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

相关问题