我有一个带有menutrip的Winform新建,打开,保存和诸如此类的东西:Textbox 如何检测文本框中未保存的数据并弹出一个窗口,要求用户在关闭程序时保存其数据? 我尊重你的所有建议。检测未保存的数据
检测未保存的数据
回答
定义一个名为isDataChanged的布尔变量并将其设置为false。在文本框的按键事件上将此变量设置为true。当用户关闭程序时,检查这个变量是否为真。如果这是真的显示一条消息,当用户保存数据,将其设置为false,否则退出程序:)
您需要注册的所有文本框更改事件时知道文本框的文本改变或不
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);
}
我同意你的解决方案,并且我面临未保存的列表
你可以发布你的代码示例,我们可以理解击球手.. – 2014-08-29 11:05:21
我认为这个语句'返回c.Select(a => a.Tag!= null);'将返回c.Select(a => a.Tag!= null).ToList();' – 2014-08-29 11:12:16
您可以使用的一种方法是定义一个boolean
变量,如bDirty
。
首先声明这个变量作为FALSE
,但把它真正在你_TextChanged
事件 - 例如myTextBox_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!
}
希望这可以帮助你!
使用标志,并在使用textbox,textchanged事件时重置。然后该标志可以用于检测用户是否编辑任何东西 – 2014-08-29 11:01:08