2014-08-29 43 views
0

我有一个带有menutrip的Winform新建,打开,保存和诸如此类的东西:Textbox 如何检测文本框中未保存的数据并弹出一个窗口,要求用户在关闭程序时保存其数据? 我尊重你的所有建议。检测未保存的数据

+0

使用标志,并在使用textbox,textchanged事件时重置。然后该标志可以用于检测用户是否编辑任何东西 – 2014-08-29 11:01:08

回答

0

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

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); 
    } 
+0

我同意你的解决方案,并且我面临未保存的列表,你能帮忙吗? – 2014-08-29 11:02:47

+0

你可以发布你的代码示例,我们可以理解击球手.. – 2014-08-29 11:05:21

+0

我认为这个语句'返回c.Select(a => a.Tag!= null);'将返回c.Select(a => a.Tag!= null).ToList();' – 2014-08-29 11:12:16

0

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

首先声明这个变量作为FALSE,但把它真正在你_TextChanged事件 - 例如myTextBox_TextChanged(所以bDirty将现在TRUE如果文本框被编辑)

在关闭/退出,然后检查bDirty并显示出如果消息框是bDirtyTRUE如下:

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

希望这可以帮助你!