2011-10-26 34 views
2

我有一個非常奇怪的問題。 我有多個用於用戶名/密碼的文本框和每個用戶/密碼組旁邊的複選框。當用戶點擊CheckBox時,如果他檢查了它,那麼在它旁邊的用戶名和密碼TextBox被啓用並且焦點被設置爲用戶名TextBox。如果用戶未選中CheckBox,則旁邊的TextBox將被禁用。但是,一個TextBox的邊框與其他禁用的TextBoxes保持不同。c#文本框邊框在被禁用時與其他禁用的文本框相比發生了變化

參見:

http://img545.imageshack.us/img545/1944/textbox.png

我認爲這是一個焦點問題,所以我改變了代碼 - 當用戶取消選中它首先集中一些其他元素上的複選框的形式,然後在禁用它,但它仍然執行相同的操作。 有關可能導致問題的任何想法?

+0

您是否檢查過所有複選框的屬性相同,並且其中一個沒有不同的樣式或其他東西? – Chris

+0

也許我沒有解釋得很好 - 它發生在所有TextBoxes上 - 在禁用之前已經關注的TextBox中(也都是使用相同的屬性創建的 - 只有例外的是具有密碼char的傳遞TextBoxes)。當我禁用用戶文本框的自動對焦並且用戶不單擊以對其進行對焦/輸入時,CheckBox在禁用時不會更改邊框。這就是爲什麼我認爲這是一個焦點問題。但後來我添加了一個測試TextBox tbTest,並做了tbTest.Focus();然後禁用2個文本框但仍然得到相同的結果。 – n1tr0

+0

啊,我明白你的意思了,是的,我誤解了它,因爲一個特定的複選框導致了問題。 :( – Chris

回答

1

據我所知,這是系統呈現控件禁用狀態的一種錯誤。我創建了下面的代碼來模擬這個問題。代碼有點冗長,但爲了方便理解邏輯流程,我這樣做了。

我創建了一個形式,:命名txtBox1,txtBox2,txtBox3和txtBox4 (我這樣做是4個選框命名chkBox1,chkBox2,chkBox3和chkBox4

設置每個文本框爲False Enabled屬性 4文本框在設計時)

private void Form1_Load(object sender, EventArgs e) { 
     chkBox1.CheckedChanged += chkBox_CheckedChanged; 
     chkBox2.CheckedChanged += chkBox_CheckedChanged; 
     chkBox3.CheckedChanged += chkBox_CheckedChanged; 
     chkBox4.CheckedChanged += chkBox_CheckedChanged; 
    } 

    private void chkBox_CheckedChanged(object sender, EventArgs e) { 
     var chkBox = ((CheckBox)sender); 
     var controlSet = chkBox.Name.Substring(6,1); 
     var txtName = "txtBox" + controlSet; 

     foreach (var txtBox in Controls.Cast<object>().Where(ctl => ((Control)ctl).Name == txtName).Select(ctl => ((TextBox)ctl))) { 
      if (chkBox.Checked) { 
       txtBox.Enabled = true; 
       txtBox.Focus(); 
      } 
      else { 
       //The checkbox stole the focuse when it was clicked, so no need to change. 
       txtBox.Enabled = false; 
      } 
     } 
    } 

現在,如果你執行這個代碼,你可以檢查複選框,使文本具有相同名稱的前綴(1,2,3或4)。這也將重點放在文本框上。現在,如果您禁用具有焦點的文本框,則其顯示的內容與其他禁用的文本框不同。

我試過各種刷新,失效等等。關於控件和表單本身無濟於事。

UPDATE

所以我發現,似乎工作黑客攻擊。如果在禁用之前將文本框的邊框樣式設置爲「無」,然後重置,則奇怪的輪廓效果不會發生。

var borderStyle = txtBox.BorderStyle; 
    txtBox.BorderStyle = BorderStyle.None; 
    txtBox.Enabled = false; 
    txtBox.BorderStyle = borderStyle; 
+0

我認爲我發現如果你在註釋行中放置了一個MessageBox.Show(「something」),點擊確定後,禁用代碼將會執行,並且TextBox將會像它應該是的 – n1tr0

+0

是的,我認爲這是合法的錯誤,就像我說過的,我試圖刷新/重繪控件無濟於事,我懷疑你想彈出一個消息框來修復控件的渲染,希望你能找出一些東西,我會玩一些東西今天下午更多。 –

+0

我發現如果您將表單重新調整大小,然後重新調整表單的大小以便不顯示格式不正確的文本框,然後將表單重新設置爲正常,則格式是正確的。但是,它在代碼中不起作用。你也可以最小化和恢復,它回到了它應該是的。 –