我有一个带有menustrip的Winform,New,Open,Save以及像Textbox这样的东西 如何在文本框中检测未保存的数据并弹出一个窗口,要求用户在关闭程序时保存其数据? 我尊重你的所有建议。
答案 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
并在bDirty
为TRUE
时显示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)