2012-12-04 4 views
3

winform 응용 프로그램에서 필자는 필수 필드에 색상 코딩을 시도하고 있습니다. 사용자 편집시 필요한 입력이 채워지면 배경이 밝은 녹색으로 변하고, 필수 입력란이 비어 있으면 배경이 빨간색으로 표시됩니다. 일부 필드는 다른 필드의 입력에 따라 활성화 및 비활성화되므로 때로는 비활성화 된 필드가 필요하며 완전히 비활성화해야합니다 (비활성화 된 배경).NumericUpDown 비활성화 된 요소의 배경색 변경

public static void UpdateBackgroundColor(this NumericUpDown control) 
{ 
    if (!control.Enabled) 
    { 
     control.BackColor = SystemColors.InactiveBorder; 
     return; 
    } 

    var inputValue = control.Value; 

    if (inputValue == 0) 
    { 
     control.BackColor = Color.Red; 
     return; 
    } 
    control.BackColor = Color.LightGreen; 
} 

유사 기능은 텍스트 상자에서 작동없이 결함과 함께 잘 작동 : 이 나는 ​​배경 변경이 것입니다. 그러나 NumericUpDown이 잘못되었습니다.

enter image description here

같은 이야기 :이 필드가 비활성화 될 때

enter image description here

그러나, 그것은 주위에 빨간색 테두리를 유지 : 이 필드가 필요하며 비어있을 때 내가 볼 것입니다 배경이 녹색이고 사용 중지되면 발생합니다.

그렇다면 왜 이런 일이 일어나고 어떻게 수정해야합니까?

UPD : 한 (Han)의 대답에 따라 코드를 신속하게 업데이트했지만 여전히 작동하지 않습니다. 내가 NUD의 모든 자식 컨트롤을 통해 이동하고 변경하는 것이 사실에도 불구하고,

numericUpDown1.Enabled = true; 
numericUpDown1.SetBackgroundColor(Color.Red); 
numericUpDown1.Enabled = false; 
numericUpDown1.SetBackgroundColor(SystemColors.InactiveBorder); 

을 그리고 아직도 텍스트 상자 주위에 그 프레임을 얻을 :

private static void SetBackgroundColor(this Control control, Color color) 
    { 
     control.BackColor = color; 
     foreach (Control childControl in control.Controls) 
     { 
      SetBackgroundColor(childControl, color); 
     } 
    } 

그리고 대략 이런 식으로 사용하고 거기에 다시 색상. 다른 아이디어?

건배 !!

+0

빨간색 배경을 설정하고 NumericUpdown 컨트롤을 사용하지 않도록 설정하는 순서는 무엇입니까? 어느 것이 먼저 완료 되었습니까? 컨트롤을 비활성화하거나 배경을 설정 하시겠습니까? 주문을 변경해보십시오. – Sivaraman

+0

먼저 빨간색으로 표시 한 다음 비활성화합니다. 나는 색상의 적용 순서와 함께 놀 것이다. – trailmax

+0

당신은 이것을 알아 냈습니까? DomainUpDown 컨트롤과 동일한 문제가 있습니다. 텍스트 상자 컨트롤의 테두리와 domainupdown 컨트롤 사이에 작은 선이있어서 색을 지정하는 방법을 찾을 수 없습니다. 나는 또한 문제를 보여주기 위해 간단한 예를 들고 어려움을 겪고있다. – CramerTV

답변

3

NumericUpdown은 여러 컨트롤로 구성됩니다. 텍스트 상자는 NUD 안에 있으며 한 픽셀 오프셋이 있습니다. 따라서 텍스트 상자의 BackColor가 외부 NUD 컨트롤과 다르게 설정되어있는 것을 볼 수 있습니다. 문제의 진정한 원인은 당신의 조각에 표시되지 않지만이 문제에 대한 생식은 다음과 같습니다

 numericUpDown1.BackColor = Color.Red; 
     numericUpDown1.Enabled = false; 
     numericUpDown1.Controls[1].BackColor = SystemColors.InactiveBorder; 

당신은 그것의 모양에 상관없이 중첩 된 컨트롤의 배경색을 설정하는 코드를 수정해야합니다. 아마도 Controls 컬렉션의 foreach 일 것입니다.

+0

한스, 머리를 다시 한 번 주셔서 감사합니다. 새로운 것은 아닙니다. 나는 당신이 제안한 것을 시도했습니다. 코드) 그 문제를 해결하지 않았다. 나는 여전히 상자 주위에 국경이있다 - ( – trailmax

+0

나는 아직도 당신의 특정 문제를 repro하는 방법을 전혀 생각하지 않아. 어쩌면이 질문은 도움이 될 것입니다 : http://stackoverflow.com/ 질문/10631788/numericupdown-backcolor-not-working-as-expected/10634086 # 10634086 –

0

나는 똑같은 문제가 있었지만, 그것은 새로 고침/다시 칠하기 문제였습니다. 레이블이 잘못 설정되었지만 전체 컨트롤이 아니므로 새로 고치기를 한 후 테두리가 사라졌습니다.

하거나 숨기고 NumericUpDown backcolor not working as expected

아를 참조

:-) 다시 보여, 나는 단지 내가 모든 가능한 테마를 시도하지 않는 것이 고전적인 테마 (그것을 본 적이 있지만, 반드시에있다 GUI 테마로).

1

거의 5 세가되는 질문에 유감스럽게 생각합니다. IMHO 이것은 NUD 컨트롤의 버그입니다. 현재 Windows CE에 이전 Windows CE 응용 프로그램을 이식하고 있습니다.우리는 CE의 NUD 컨트롤에 아무런 문제가 없었지만 이제는 모두 트레일 맥스와 똑같은 문제점을 보여주고 있습니다.

약간의 관찰을 추가 할 수 있습니다. 컨트롤이 비활성화되면 자식 컨트롤의 프레임이 새로 고쳐지지 않습니다. 배경색은 아무런 영향을 미치지 않습니다. 이전에 화면에 표시된 내용은 NUD 컨트롤의 안쪽 프레임에 표시됩니다. 우리는 여러 개의 TabPage를 사용합니다. 이전에 표시된 화면에 따라 프레임이 깨지거나 때로는 화려한 프레임이 나타납니다.

유일한 대안은 화면에 표시된 후에 컨트롤을 사용하거나 사용하지 않도록 설정하는 것입니다. 앞에서 말했듯이 컨트롤은 TabPages에 있으므로 탭 선택 이벤트를 사용하고 있습니다. 우리는이 두 라인 모두 NUD 컨트롤을 통해 많은 탭과 많은 NUD 컨트롤, 5, 내가 루프 20을 가지고 실행 이후 :

nudControl.enabled = !nudControl.enabled 
    nudControl.enabled = !nudControl.enabled 

을 내가 컨트롤을 사용하거나 사용하지 않은 경우, 나는 단순히 전환 확인 할 필요가 없습니다 반대 값으로 설정 한 다음 다시 토글합니다. 우리 응용 프로그램에서는 매우 빠르게 실행되며 화면에 시각적 인 깜박임이 표시되지 않습니다. 다시 말하지만, 우리는 주어진 탭 페이지에 20 개 미만의 NUD가 있습니다.

P. 이 자식 StackOverflow 게시물의 코드를 사용하여 모든 어린이 NUD 컨트롤을 가져옵니다. How to get ALL child controls of a Windows Forms form of a specific type (Button/Textbox)?

+0

참으로 오래된 질문 - 나는이 프로젝트에 대한 코드가 더 이상 필요하지 않습니다! – trailmax