C# 在运行存储过程C之前,检查textbox或datepicker是否已更改#

C# 在运行存储过程C之前,检查textbox或datepicker是否已更改#,c#,wpf,xaml,stored-procedures,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 da

我正在寻找一种简单的方法来检查自表单打开以来文本框或日期选择器是否已更改。如果它确实运行了存储过程,那么只需跳过它并运行已更改的存储过程

我所拥有的:

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);
}  
<TextBox x:Name="txtAvgR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
<TextBox x:Name="txtOTR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
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;
    }
}
例如:如果
txtAvgR.Text
和/或
df.AvgR.Value
已更改,则运行
oldAvgRate
,否则跳过并运行
oldorate
如果
txtOTR.Text
和/或
df.OTR.Value
已更改,否则不要运行任何选项并显示消息框(“无任何更改”)

我怎样才能做到这一点?对我来说,最好的方法是什么?多谢各位

根据@野餐8和@Robert Harvey的建议更新:

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);
}  
<TextBox x:Name="txtAvgR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
<TextBox x:Name="txtOTR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
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;
    }
}
XAML:

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);
}  
<TextBox x:Name="txtAvgR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
<TextBox x:Name="txtOTR" TextChanged="textChangedEventHandler" IsEnabled="False"/>
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中,只需像这样引用此事件委托

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


txtAvgR
dv.AvgR
AfterUpdate
事件上设置一个布尔标志。在
btnSave\u单击
方法中检查该标志。感谢您的建议。我不知道从哪里开始,我还在学习。你能告诉我你会怎么做吗?非常感谢。textbox text.changed没有事件侦听器模板吗?我建议让这个text.changed事件监听器设置一个标志,你的btnSave引用这个标志。谢谢道格的建议。尚未出现text.changed事件。我不确定是否应该将text.change事件或标记发送给您。非常感谢您的支持。非常好的回答,谢谢您的帮助!这正是我想要的。但是,它不起作用。尽管我遵循了您的建议,但当我保持所有内容不变时,这两个存储过程都在btnSave_Click上运行。就像if语句不存在一样。只执行语句的第一部分。你能看看我最新的问题吗?我做错了什么?据我所知,当TextBox控件创建并最初填充文本时,会触发此事件。如果我没有错,这意味着您应该在第一次(创建控件时)忽略标志分配,在事件方法中放置一个断点,并告诉我它是否在您启动解决方案时输入。如果是的话,你就发现了问题:)嗯,当我在本地测试它时,它对我有效,你能在If(hasChangedFlag)行上放置一个断点吗?如果你在框中键入一些内容,然后按下按钮,你能观察应用程序的流程吗。在我的电脑上,当我按下按钮时,它会进入事件处理程序(hasChangedFlag=true)和if语句。也只是为了确保,将标志值初始化为false。哦,我知道为什么!oldAvgRate和oldOTRate具有相同的事件处理程序。您需要在btn_SaveClick上添加一个if。让我为你更新我的答案。