在运行存储过程C#之前检查文本框或日期选择器是否已更改

iCo*_*min 2 c# wpf xaml stored-procedures

我正在寻找一种简单的方法来检查自打开表单后文本框或日期选择器是否已更改.如果它然后运行存储过程,否则只是跳过它并运行已经更改的那些.

是)我有的:

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);
}  
Run Code Online (Sandbox Code Playgroud)

例如:if txtAvgR.Text和/或df.AvgR.Value已更改然后运行oldAvgRateelse跳过并运行oldOTRateif txtOTR.Text和/或df.OTR.Value已更改否则不运行其中任何一个并显示MessageBox("Nothing has changed").

我怎样才能做到这一点?在我的情况下,最好的方法是什么?谢谢.

根据@ Picnic8和@Robert Harvey的建议更新:

XAML:

<TextBox x:Name="txtAvgR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
<TextBox x:Name="txtOTR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Pic*_*ic8 5

根据@Robert Harvey的建议,这是一种实现标志的方法.

更新

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在在您的XAML中,只需像这样引用此事件委托

<TextBox x:Name="txtAvgR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
    <TextBox x:Name="txtOTR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
Run Code Online (Sandbox Code Playgroud)

  • 从我读到的内容,此事件在创建TextBox控件并最初使用文本填充时触发.如果我没有错,那就意味着你应该第一次忽略标志分配(当控件被创建时)在事件方法中放置一个断点,并告诉我,当你只是开始你的解决方案时它是否进入.如果是的话,你刚发现问题:) (2认同)
  • 嗯,当我在本地测试它对我有用时,你是否可以在线上设置一个断点(hasChangedFlag)并观察应用程序的流程,如果你在框内输入内容并按下按钮后.在我的电脑上,当我按下按钮时,它进入事件处理程序(hasChangedFlag = true)和if语句.另外,为了确保,将标志值初始化为false. (2认同)