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