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

标签 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);
}  

例如:如果 txtAvgR.Text 和/或 df.AvgR.Value 已更改,则运行 oldAvgRate,否则跳过并运行 oldOTRate 如果 txtOTR.Text 和/或 df.OTR.Value 已更改,否则不要运行其中任何一个并显示 MessageBox("Nothing haschanged ”)。

我怎样才能实现这个目标?对于我的情况,最好的方法是什么?谢谢。

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

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;
    }
}

最佳答案

根据 @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;
    }
}

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

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

关于c# - 在运行存储过程 C# 之前检查文本框或日期选择器是否已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46796933/

相关文章:

c# - 如何从原始心电图数据写入 DICOM 文件

添加时 C# datagrid 不会更新 itemsource

c# - 是否可以在 XAML 中声明类型别名?

c# - XAML GridView 模板绑定(bind)到项目

c# - 创建一个由矩形填充的网格

c# - 如何通过所有数据流 block 传播消息上限?

c# - 从阅读器打印出多行

c# - 围绕钟面或指南针(或任何其他圆圈)导航的算法或函数?

WPF 数据网格绑定(bind)复杂类型属性

wpf - 使用 WPF 覆盖 2 个控件并切换哪个控件可见