2012-07-27 129 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