2017-03-06 89 views
-6

我有这个简单的代码...布尔值不改变

Public class Form1 : Form { 

    //bool value = false; 
    bool value; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) { 
      if (value) { 
      MessageBox.Show("ValueChanged"); 
      } 
    } 

    private void btn_Click (Object sender, EventArgs e) { 
      value = true; 
      MessageBox.Show("btnClicked"); 
    } 
} 

MessageBox的表现时btn_Click被触发,而不是在Form1_Load事件?

Iv'e也尝试将if(value)语句放在Form1构造函数中(在InitializeComponent方法之后),但bool保持不变。有什么建议么?

编辑: 但是,如果它不'重置'数据呢?

+0

您将'value'初始化为'false',因此消息框将不会显示,除非您在对象构造和表单加载之间更改了其他位置。 – crashmstr

+0

研究一下编程,你会注意到每件事都有一个序列。就像生活一样,一旦它已经完成,你就不能改变它。 – Kroltan

+1

当表单*加载*时发生'Load'事件。你在表单加载后点击按钮*,为什么你会期望'Load'事件再次触发? –

回答

0

窗体构造函数和Form_Load代码在按钮单击事件处理程序将变量设置为true之前运行。如果关闭表单并创建它的新实例,那么该实例将拥有自己的字段,该字段最初也是错误的。因此if语句中的代码将永远不会被执行。

+0

谢谢,放在 – JoTheProgrammer

0

只需编写一个if语句就不会“监视”更改的值 - 它只是在您告诉它时运行。

下面的事件处理

private void Form1_Load(object sender, EventArgs e) { 
     if (value) { 
     MessageBox.Show("ValueChanged"); 
     } 
} 

运行形式加载时。完全没有理由再次运行,因为value已更改。请注意,这并不意味着value不会更改。

您可能想要了解C# events,这是Observer Pattern的实现。您可能还对INotifyPropertyChanged interface感兴趣。

+0

我知道Form1_Load中添加的控件停留在内存中,并且它在主线程中读取... Form1_Load只触发一次? – JoTheProgrammer

+0

@JoTheProgrammer它只在窗体实际加载时触发。 – EJoshuaS