检测未保存的数据

时间:2014-08-29 10:52:27

标签: c# winforms

我有一个带有menustrip的Winform,New,Open,Save以及像Textbox这样的东西 如何在文本框中检测未保存的数据并弹出一个窗口,要求用户在关闭程序时保存其数据? 我尊重你的所有建议。

4 个答案:

答案 0 :(得分:1)

您需要注册所有文本框更改事件才能知道文本框文本是否已更改

private void Form1_Load(object sender, EventArgs e)
    {
    var c = GetAll(this,typeof(TextBox));
    foreach (TextBox item in c)
        item.TextChanged += new EventHandler(textBox1_TextChanged);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        //set textbox tag = true to check whether text changed or not
        ((TextBox)sender).Tag=true;
    }

    public IEnumerable<Control> GetAll(Control control,Type type)
    {
        var controls = control.Controls.Cast<Control>();

        return controls.SelectMany(ctrl => GetAll(ctrl,type))
                                  .Concat(controls)
                                  .Where(c => c.GetType() == type);
    }

    // now you can get changed checkbox 
    List<TextBox> getchangedtextbox(){
    var c = GetAll(this,typeof(TextBox));
        // not get list of changed checkbox witch have null value in TAG
       return c.Select(a=>a.Tag!=null);
    }

答案 1 :(得分:0)

定义名为isDataChanged的布尔变量并将其设置为false。在文本框的keypressed事件上将此变量设置为true。当用户关闭程序时,检查此变量是否为true。如果为true则显示消息,当用户保存数据时将其设置为false,否则退出程序:)

答案 2 :(得分:0)

您可以使用的一种方法是定义boolean变量,例如bDirty

最初将此变量声明为FALSE,但在_TextChanged事件中将其设置为true - 例如myTextBox_TextChanged(因此bDirty现在为TRUE textBox已编辑)

在关闭/退出时,请检查bDirty并在bDirtyTRUE时显示MessageBox,如下所示:

 if (bDirty) 
 {
    DialogResult result = MessageBox.Show("Do you want to save changes?", "Confirmation", messageBoxButtons.YesNoCancel);
        if(result == DialogResult.Yes)
            //... Do something
        else if (result == DialogResult.No)
            //...Do something esle
        else
            //...Do something else - go wild! 
 }

希望这会帮助你!

答案 3 :(得分:0)

但是当您有多个输入字段时,很难针对每个输入触发 on_click 事件,我将上述逻辑修改如下:

声明全局变量

Boolean isDataChanged = false;

现在,创建表单/组离开事件,默认情况下它是假的所以它会生成消息..并且会在表单/组失去焦点时工作:-)

private void grp_Leave(object sender, EventArgs e)
{
    if (isDataChanged == false)
    {
        MessageBox.Show("data is not saved, either saved or cancel");
    }
}

在保存和取消按钮上,将布尔值设置为 true

isDataChanged = true;

private void bttn_SAVE(object sender, EventArgs e)
{
  isDataChanged = true;
    
  // call your function to save_data
    
}


private void bttn_Cancel(object sender, EventArgs e)
{
  isDataChanged = false;
    
  // call your function to show_data
    
}

这个逻辑对我有用,如果这个逻辑也适合你(Y)