2012-04-19 78 views
0

我在Windows窗體項目中遇到特定窗體的問題。只有一種形式存在問題;還有其他幾個使用相同類型的引用,但沒有這個問題。Windows窗體控件不會被後面的代碼更新

問題是通過後面的代碼修改控件實際上並沒有在窗體上更新它們。通過將從數據庫中提取的值添加到組合框的Items集合(通過.Items.Add()方法),設置要啓用或不啓用的文本框或複選框,設置文本框的文本或檢查的檢查狀態盒子...沒什麼作用。我已經試過註釋掉所有方法中的所有代碼,除了代碼之外,它們實際上爲某些控件設置了啓用狀態,以確保沒有其他任何東西在我不知情的情況下運行,但問題仍然存在。

如調試器顯示的那樣,更改啓用狀態的代碼肯定是命中的,並且啓用狀態設置正確,根據條件是正確還是錯誤。應該禁用的控件仍然是可編輯的,仍然看起來像是可編輯的。代碼最初是使用intellisense編寫的,可以自動填寫控件名稱,所以從後面的代碼鏈接到表單上的正確控件應該沒有任何問題。我也試着將表單放大並放在一個空白的面板中,並帶有一個新的文本框和複選框,並且通過相同的方法將面板設置爲啓用或禁用,並且當它運行時控件也不是由後面的代碼改變。

對我可能錯過的任何建議?這是Windows窗體的基本功能,我不知道可能是什麼問題,並且我無法通過谷歌搜索或搜索此網站找到任何類似的問題。

謝謝!

編輯:這是一個應該工作,但它不是的代碼示例。類似的代碼在其他一些形式上使用沒有問題。

如果選中了一個名爲chkDisable複選框,此事件上運行:

private void chkDisable_CheckedChanged(object sender, EventArgs e) 
    { 
     SetControlsEnabledStatus(!((CheckBox)sender).Checked); 
    } 

    private void SetControlsEnabledStatus(bool enabledStatus) 
    { 
     textBox1.Enabled = enabledStatus; 
     textBox2.Enabled = enabledStatus; 
    } 

我敢肯定,100%,本次活動的接線是否正確,它正確,火災和其他文本框的Enabled狀態設置是否正確。沒有其他方法可以覆蓋這個未註釋的代碼。但是,只要單擊複選框後再次加載表單,文本框始終處於啓用狀態。

EDIT2:如果有人遇到這種針對自己的問題,這裏是什麼引起了我的問題:

我不得不從頭開始一個新的形式,最終得到這個追查。事實證明,在構造函數和FormLoad事件中都有對InitializeComponent()的調用。基本上,我創建了一個帶有相同控件的新窗體,只有Disable事件在運行,當我複製Load代碼時,Disable停止工作。

+1

顯示你的代碼? – Likurg 2012-04-19 19:53:46

+0

...可能是* .Designer .cs文件也是如此。 – Alan 2012-04-19 20:09:52

+0

@Likurg,我已經添加了一個代碼示例。 – Greg 2012-04-19 20:35:00

回答

1

嘗試清理您的解決方案並重新開始所有工作。 (:

如果不工作,你能發佈一些代碼

編輯:

好,無碼看這裏......我要報價一些基本的建議。

開始在整個表單中放置MessageBox.Show(「I executed!」)。將它放入構造函數/初始化事件中。將它放在click事件中等等。您可能在某處處理異常,並且更新表單的代碼永遠不會有機會執行。

很明顯,有什麼問題,直到我們可以排除代碼中存在該問題,我們將假設它在那裏。如果您發佈了代碼,我們可以將其複製並粘貼到我們自己的項目中,並查看它的行爲。如果它有效,那麼我們可以確認代碼是好的,並且問題必須存在於其他地方。

希望有所幫助。 (:

編輯:

好吧,使用您提供的代碼,我創建了一個沙箱項目:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WinFormsSandbox 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void chkDisable_CheckedChanged(object sender, EventArgs e) 
     { 
      SetControlsEnabledStatus(!((CheckBox)sender).Checked); 
     } 

     private void SetControlsEnabledStatus(bool enabledStatus) 
     { 
      textBox1.Enabled = enabledStatus; 
      textBox2.Enabled = enabledStatus; 
     } 
    } 
} 

enter image description here

enter image description here

這對我的作品。該錯誤不得在您發佈的代碼中存在。

編輯:

你知道,我討厭在找到問題的根本原因放棄,但如果這是一個時間敏感的問題,它可能會更快,爲您從頭開始創建一種新形式只需複製功能。 (:

+0

謝謝,但清理解決方案並沒有幫助。我是n請確保代碼示例有多大幫助,因爲它非常標準 - 複選框的CheckChanged方法,然後根據是否選中其他控件來禁用或啓用其他控件。 – Greg 2012-04-19 20:08:47

+0

@Greg,所以你希望我們找到你的問題沒有任何代碼。如果一切都是「非常標準的」,你就不會問這個問題。無論如何,如果我能找到我的水晶球,我會嘗試尋找解決方案。 – 2012-04-19 20:16:53

+0

@ L.B,不需要嗤之以鼻。我知道在這方面有比我更多的經驗和知識的人,所以我不認爲沒有代碼示例的要求是不好的。也就是說,我編輯了我的帖子以包含樣本。如果您有任何建議,請告訴我。 – Greg 2012-04-19 20:28:00

1

我有類似的問題,他們已經通過添加一個OnShown處理程序到我的表單,它翻轉了一個布爾值來保護其他事件處理代碼。我們的想法是,在初始化過程中的東西是導致控件的事件以你不想要發生的方式觸發,這並不理想,但至少可以作爲一個調試措施來嘗試。

+0

)謝謝,這是一個我沒有想到的想法,我添加了它,並發現它通過OnShown的兩個方法事件處理程序運行兩次,但問題仍然存在,但這絕對是一步正確的方向。 – Greg 2012-04-19 20:41:07