创建一个智能保存按钮

本文关键字:智能 保存 按钮 一个 创建 | 更新日期: 2023-09-27 17:52:40

我正在使用c#设计一个桌面应用程序。Net和MSSQL。该应用程序包含一个表单,用户可以在其中更改文本框中的一些值,然后按下按钮将其保存在数据库中。下面的代码调用一个方法来更新值并将它们插入数据库,旁边显示一个确认新更改的消息框。我的问题是,即使用户没有更改任何值并按下保存按钮,消息框也会再次出现。我试图比较文本框的值之前和之后的变化,但它不工作。有办法克服这个问题吗?

  private void btnSave_Click(object sender, EventArgs e)
    {
        int price = Convert.ToInt32(txtPrice.Text);
        Classes.Prices prices = new Classes.Prices(comboBox1.SelectedValue.ToString(),
            Convert.ToInt32(txtPrice.Text), 
            Convert.ToInt32(txtCarbohydrate.Text), 
            Convert.ToInt32(txtProtein.Text),
            Convert.ToInt32(txtFat.Text),
            Convert.ToInt32(txtHumidity.Text), 
            Convert.ToInt32(txtminerals.Text));
        try { 
            prices.updateMaterialPrice();
            //this.comboBox1.Refresh();
            this.txtPrice.Refresh();
            int price2 = Convert.ToInt32(txtPrice.Text);
           if (price2 != price)
           {
               MessageBox.Show("new price saved!");
           }
        }
            catch(Exception ex)
        {
            throw ex;
        }
            foreach (Control ctrl in this.panel1.Controls)
            {
                if (ctrl is TextBox)
                {
                    TextBox textbx = ctrl as TextBox;
                    if (textbx.ReadOnly == false)
                    {
                        textbx.ReadOnly = true;
                        textbx.BackColor = Color.LightBlue;
                    }
                }
            }                    

创建一个智能保存按钮

1-创建一个标志变量来指示用户是否已经开始修改值(我们称之为:数据已更改),初始值为False

2-将事件处理程序附加到所有文本框的Change()事件,并在事件处理程序中,将标志设置为TRUE,以表明我们现在可以安全地转到DB并保存更改的值

3-在你的Save方法开始时,检查我们的标志的值,如果它是false,那么什么都不做,但如果值是TRUE,然后去保存你的东西

例如:(伪代码)

1

var dataIsChanged = false;
2

public void ChangedHandlerForTexboxes(object sender, EvenetArgs e)    
{
   dataIsChanged = true;    
}

3

    private void btnSave_Click(object sender, EventArgs e)
    {
       if(dataIsChanged == true)
       { 
int price = Convert.ToInt32(txtPrice.Text);
        Classes.Prices prices = new Classes.Prices(comboBox1.SelectedValue.ToString(),
            Convert.ToInt32(txtPrice.Text), 
            Convert.ToInt32(txtCarbohydrate.Text), 
            Convert.ToInt32(txtProtein.Text),
            Convert.ToInt32(txtFat.Text),
            Convert.ToInt32(txtHumidity.Text), 
            Convert.ToInt32(txtminerals.Text));
        try { 
            prices.updateMaterialPrice();
            //this.comboBox1.Refresh();
            this.txtPrice.Refresh();
            int price2 = Convert.ToInt32(txtPrice.Text);
           if (price2 != price)
           {
               MessageBox.Show("new price saved!");
           }
        }
            catch(Exception ex)
        {
            throw ex;
        }
            foreach (Control ctrl in this.panel1.Controls)
            {
                if (ctrl is TextBox)
                {
                    TextBox textbx = ctrl as TextBox;
                    if (textbx.ReadOnly == false)
                    {
                        textbx.ReadOnly = true;
                        textbx.BackColor = Color.LightBlue;
                    }
                }
            }        
       }
    }

问题是price和price2将始终具有相同的值,因为您在用户按下"保存"按钮的时刻捕获它们,因此您将始终获得消息框,它是这样的:用户更改价格文本框,然后用户按下"保存"按钮并运行"btnSave_Click"方法,因此此时txtPrice具有用户键入的值。

我建议有一个单独的数据访问层,使用类似实体框架的东西,然后你可以询问实体,如果它的任何值已经改变。检查这些,它们可能会对你有所帮助:

实体框架:检查是否有特定实体的更改要保存

http://www.codeproject.com/Articles/615499/Models-POCO-Entity-Framework-and-Data-Patterns