创建智能保存按钮

时间:2014-03-24 18:27:03

标签: c# .net

我正在使用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;
                    }
                }
            }                    

2 个答案:

答案 0 :(得分:2)

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

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

在你的Save方法的开头3-,检查我们的标志的值,如果它是假的,那么什么也不做,但如果值为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;
                    }
                }
            }        

       }
    }

答案 1 :(得分:1)

问题是价格和价格2将始终具有相同的值,因为您在用户按下&#34; save&#34;按钮,所以你总是得到消息框,它是这样的:用户更改价格文本框然后用户按下&#34;保存&#34;按钮和&#34; btnSave_Click&#34;方法运行,所以此时txtPrice具有用户键入的值。

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

Entity framework: check if there are changes to be saved from a specific Entity

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