2012-07-27 127 views
0

假设我们有一个带有保存工具栏按钮的Win32窗体,并且一些CheckBox等控件位于窗体上,现在我们为复选框的onchange事件编写一行代码以启用/禁用保存按钮。假设首先选中复选框,禁用保存按钮,现在取消选择复选框,保存按钮变为启用...现在再次选择复选框保存按钮仍然启用...例如,对于TextBox也是如此。假设它的文本是“Hi”...将其更改为“Hi Bye”,保存已启用...将其更改为“Hi”,保持启用... 是否有我们可以使用的模型防止这些错误的启用/禁用保存按钮?正确启用/禁用保存按钮

+2

你可以用段落和更容易阅读的东西重新说话! :) – 2012-07-27 13:43:29

+0

大多数文本编辑器只是不打扰。处理撤消对上次保存版本的更改,但手动编辑回到之前的版本只需要太多的检查。 – MPelletier 2012-07-27 13:45:18

+0

好吧,我主要是想着一个“IsDirty”逻辑,它可以跟踪每个控件的状态作为一个对象,并保留这些对象的备份,比较它们,确定它是否脏。然后启用保存按钮。 – Bohn 2012-07-27 15:15:21

回答

1

您可以存储上次保存的状态,并在每次更改时比较当前状态,以查看它们是否相同。如果是这样,请禁用该按钮。

如果这些比较是昂贵的,可以通过计算所有需要保存的字段的散列值,并且只在最后保存的状态的散列与散列匹配时进行适当的比较的现状。

+0

我主要考虑的是一个“IsDirty”逻辑,它可以跟踪每个控件的状态作为对象,并保留这些对象的备份,比较它们,确定它是否脏。然后启用保存按钮。 – Bohn 2012-07-27 15:15:46

+0

啊哈希值...这听起来像个好主意.. – Bohn 2012-07-27 15:16:40

0

我不明白你在哪里与你的复选框去,但我会用一个布尔变量:

private Boolean _canSave = false; 
private Boolean CanSave 
{ 
    get { return _canSave; } 
    set 
    { 
     _canSave = value; 
     MenuSave.Enabled = value; 
    } 
} 

public void MenuSave_Click() 
{ 
    Save(); 
} 

private void Save() 
{ 
    // do your thing 

    CanSave = false; 
} 

public void TextBox_TextChanged() 
{ 
    CanSave = true; 
} 

当你恢复文本回到这不会考虑禁用保存菜单它的原始。如果需要,您必须将Save()方法中的文本存储在专用变量中,并将其与每个TextBox_TextChanged()上的当前文本进行比较,以确定是否发生了与原始(即自上次保存以来)相比的变化。

+0

是的我主要是想着一个“IsDirty”逻辑,它可以跟踪每个控件的状态作为一个对象,并且还保留这些对象的备份,比较他们,决定是否脏......然后启用保存按钮... – Bohn 2012-07-27 15:13:48

2

您需要在复选框的CheckedChanged事件中编写一些IF - ELSE代码。通过检查控件的属性(复选框)来检查当前状态是什么,如果是,则将Button的Enabled proeprty设置为true,否则为false。

private void checkBox2_CheckedChanged(object sender, EventArgs e) 
{ 
    if (checkBox2.Checked) 
     button1.Enabled = true; 
    else 
     button1.Enabled = false; 
} 

假设checkBox2是复选框的名字和button1是保存按钮的名称。

也可以对其他控件使用相同的IF ELSE逻辑。要设置文本框的值,可以使用Text属性

TextBox1.Text="I am gonna try something now"l 

编辑:作为comecme建议,如果你只想要启用基于该checbox /禁用按钮,它可以在一个行来完成,而不是这样

button1.Enabled=checkBox2.Checked 
+0

更简单的将是:'button1.Enabled = checkBox2.Checked;' – comecme 2012-07-27 14:14:28

+0

@comecme:是的。但是我使用IF ELSE来使OP了解什么是和如何解决这样的问题。我也会添加这个答案。 – Shyju 2012-07-27 14:16:05

+0

我主要想着一个“IsDirty”逻辑,它可以跟踪每个控件的状态作为一个对象,并保留这些对象的备份,比较它们,确定它是否脏。然后启用保存按钮。 – Bohn 2012-07-27 15:15:34

0

我喜欢的if else块把我所有的控制状态检查和设置成一个单一的方法:

private void UpdateControls() 
{ 
    saveButton.Enabled = checkBox1.Checked; 
    otherButton.Visible = checkBox2.Checked && textBox.Text.Length > 0; 
} 

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    UpdateControls(); 
} 

private void checkBox2_CheckedChanged(object sender, EventArgs e) 
{ 
    UpdateControls(); 
} 

private void textBox_TextChanged(object sender, EventArgs e) 
{ 
    UpdateControls(); 
} 

这意味着你只需要一个地方来检查和设置状态,并且更容易理解正在发生的事情,特别是当你有复杂的表单时。在分配布尔变量时,我也更喜欢布尔表达式而不是if语句,因为它无需编写单独的else语句(可能会被遗忘),从而迎合true和false。

+0

我主要是想着一个“IsDirty”逻辑,它可以跟踪每个控件的状态作为一个对象,并保留这些对象的备份,比较它们,确定它是否脏。然后启用保存按钮。 – Bohn 2012-07-27 15:16:52