C# 检测未保存的数据

C# 检测未保存的数据,c#,winforms,C#,Winforms,我有一个Winform,它有一个菜单,包括“新建”、“打开”、“保存”和“文本框” 如何在文本框中检测未保存的数据,并在关闭程序时弹出窗口要求用户保存数据? 我尊重你的建议 定义一个名为isDataChanged的布尔变量并将其设置为false。在文本框的按键事件中,将此变量设置为true。当用户关闭程序时,检查此变量是否为真。如果为true,则显示消息,当用户保存数据时,将其设置回false,否则退出程序:)您需要注册所有textbox更改事件,以了解textbox文本是否已更改 privat

我有一个Winform,它有一个菜单,包括“新建”、“打开”、“保存”和“文本框” 如何在文本框中检测未保存的数据,并在关闭程序时弹出窗口要求用户保存数据?
我尊重你的建议

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

您需要注册所有textbox更改事件,以了解textbox文本是否已更改

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);
    }
private void Form1\u加载(对象发送方,事件参数e)
{
var c=GetAll(这个,typeof(TextBox));
foreach(c中的文本框项)
item.TextChanged+=新事件处理程序(textBox1\u TextChanged);
}
私有void textBox1\u TextChanged(对象发送方,事件参数e)
{
//设置textbox tag=true以检查文本是否已更改
((文本框)sender).Tag=true;
}
公共IEnumerable GetAll(控件,类型)
{
var controls=control.controls.Cast();
返回控件。SelectMany(ctrl=>GetAll(ctrl,键入))
.Concat(控制)
。其中(c=>c.GetType()==type);
}
//现在您可以更改复选框了
列出getchangedtextbox(){
var c=GetAll(这个,typeof(TextBox));
//不获取标记中具有空值的已更改复选框的列表
返回c.Select(a=>a.Tag!=null);
}

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

最初将此变量声明为
FALSE
,但在
\u TextChanged
事件中将其设置为true-例如
myTextBox\u TextChanged
(因此如果编辑了文本框,
bDirty
现在将为
true

关闭/退出时,选中
bDirty
,如果
bDirty
TRUE
,则显示一个消息框,如下所示:

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

希望这对你有帮助

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

声明全局变量

Boolean isDataChanged = false;
现在,创建表单/组休假事件,默认情况下为false,因此它将生成消息。。并且在窗体/组失去焦点时将起作用:-)

在“保存并取消”按钮上,将布尔值设置为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)

使用一个标志,并在使用textbox、textchanged事件时重置。然后该标志可以用来检测用户是否编辑了任何内容。我非常同意您的解决方案,而我面临的是未保存的列表,您能帮忙吗?我认为这条语句“return c.Select(a=>a.Tag!=null);”将是“返回c.Select(a=>a.Tag!=null).ToList();”我可以通过电子邮件问你吗?你在问我吗@TuyenNguyen@Zohaib阿斯拉姆:是的,先生
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
    
}