2010-06-17 2 views
2

C#의 NumericUpDown 컨트롤에 대한 특정 구성을 구성하는 데 문제가 있습니다.C# NumericUpDown 컨트롤의 시차 증가

기본적으로 Increment 간격을 설정할 수 있음을 알았지 만 클릭 한 화살표 (위 또는 아래)에 따라 Increment 간격을 관리하고 싶습니다. 컨트롤의 이벤트를 확인했지만 각 화살표에 대한 이벤트를 찾지 못했습니다.

기본적으로 서로 다른 값에서 증분이 다른 컨트롤을 만들고 싶습니다. 0.04 등

의 5.00에서 0.01 0.00 5.00 단위에서

20.00로 증가이 가능합니까?

참고 : 또한 valuechanged 이벤트가 트리거 될 때 마지막 값에 대한 컨트롤의 기록 값이 유용 할 수 있습니다. 이것이 존재합니까?

의견이나 제안 사항에 대해 미리 감사드립니다.

편집 : 제대로 설명하지 않았으므로 편집합니다. 여기에서 어떤 화살표가 눌려 졌는지 알기를 원하기 때문에 그 이유가 있습니다.

나는 이것보다 더 많거나 적은 것을 가지고 있습니다. 모든 범위를 추가하고 화살표 대신 키보드를 사용하여 값 필드에 잘못된 값을 직접 설정하지 못하도록 모듈로 나누기를 사용하여 일부 검사를 추가했습니다. 문제는 화살표를 사용하여 제한을 통과하면 모든 것이 정상입니다. 그러나 화살을 사용하면 한 걸음 만 놓치지 요. 값이 100이고 나는 아래를 클릭하면이 경우

if (cuotaUno.Value >= 30M && cuotaUno.Value < 50M) 
    { 
     cuotaUno.Increment = 2M; 
     if (!((cuotaUno.Value % 2M) == 0)) 
     { 
      cuotaUno.Value = cuotaUno.Value - (cuotaUno.Value % 2M); 
     } 

    } 

    if (cuotaUno.Value >= 50M && cuotaUno.Value < 100M) 
    { 
     cuotaUno.Increment = 5M; 
     if (!((cuotaUno.Value % 5M) == 0)) 
     { 
      cuotaUno.Value = cuotaUno.Value - (cuotaUno.Value % 5M); 
     } 

    } 

는, 내가 90이고 나는가 클릭하면, 제대로 95과 100로 이동, 90 대신 95로 직접 이동하지만.

+0

왜 어떤 버튼을 눌렀는지 알아야합니까? NumericUpDown.ValueChanged 이벤트 처리기의 값을 확인하고 그에 따라 NumericUpDown.Increment를 조정하십시오. – Tester101

+0

증가량을 100에 도달하면 10M으로 설정했을 것입니다. 이제 다시 돌아 오면 여전히 10M이므로 값은 이제 90M이됩니다. 이는 또한 50에서 값을 줄이면 발생합니다. 50으로 이동합니다. 이것은 (50-5)가 45이고 2M으로 나눌 수 있는지 확인한 후 30M에서 49M까지 떨어지기 때문에 발생합니다. 값은 44입니다.해결 방법은 내 솔루션을 확인하십시오. – Amsakanna

+0

주의! 논리를 수행하는 동안 언제든지 cuotaUno.Value를 설정하지 마십시오. 그냥 변수에 저장하고 변수와 함께 로직을 수행 한 다음 마지막으로 속성에 설정하십시오. 그렇지 않으면 다시 ValueChanged 이벤트를 트리거합니다. – Amsakanna

답변

2

NumericUpDown.ValueChanged 이벤트와 NumericUpDown.Increment 속성을 사용하여 기적을 수행 할 수 있습니다.

보조 메모로 증가 또는 가속도에 대해 특별히 알고 있는지 잘 모르겠다면 NumericUpDown.Accelerations 속성을 확인하십시오.

UPDATE

readonly decimal PART1 = 30M; 
readonly decimal PART2 = 50M; 
readonly decimal PART3 = 100M; 
readonly decimal INC1 = 1M; 
readonly decimal INC2 = 2M; 
readonly decimal INC5 = 5M; 
readonly decimal INC10 = 10M; 

private void cuotaUno_ValueChanged(object sender, EventArgs e) 
{ 
    decimal val = cuotaUno.Value; 
    decimal inc = cuotaUno.Increment; 
    decimal rem; 

    if (val < PART1 && inc != INC1) 
    { 
     if (inc == INC2 && val == (PART1 -INC2)) 
      val += (inc - INC1); 
     inc = INC1; 
    } 
    else if (val >= PART1 && val < PART2 && inc != INC2) 
    { 
     if (inc == INC5 && val == (PART2-INC5)) 
      val += (inc - INC2); 
     inc = INC2; 
     rem = val % INC2; 
     if (rem != 0) 
      val -= rem; 
    } 
    else if (val >= PART2 && val < PART3 && inc != INC5) 
    { 
     if (inc == INC10 && val == (PART3-INC10)) 
      val += (inc - INC5); 
     inc = INC5; 
     rem = val % INC5; 
     if (rem != 0) 
      val -= rem; 
    } 
    else if (val >= PART3 && inc != INC10) 
    { 
     inc = INC10; 
     rem = val % INC10; 
     if (rem != 0) 
      val -= rem; 
    } 

    cuotaUno.Increment = inc; 
    cuotaUno.Value = val;    
} 
+0

해당 이벤트와 속성을 사용하여 어떤 화살표를 눌렀는지 어떻게 알 수 있습니까? 나는 그것을 보지 않는다 :-( – mihe

+0

너 자신을 할 수있다 - 각 ValueChanged에, 당신의 서브 클래스의 10 진수 인스턴스 var와 같은 어딘가에 새로운 값을 저장하면, 현재와 마지막 모두 이벤트에서 알 수있다. 가치가있는 것 같아. (내가 바른 것들을 파싱 할 경우) –

+0

@mihe : 내 업데이트를 확인하십시오. – Amsakanna

0

NumericUpDown 컨트롤을 불 활성화하는 컨트롤을 만듭니다.

OnkeyDown 메서드를 재정의하고 현재 값을 확인한 다음 증분을 변경 한 다음 기본 클래스의 implation을 호출합니다.

그게 내가 시도 할거야.

+0

안녕하세요 Bob, 먼저 감사합니다. 안타깝게도 컨트롤이 여러 가지 방법으로 변경 될 수 있으므로 OnKeyDown 메서드가 내가 원하는 것을 어떻게 처리하는지 알지 못합니다. 그래서 이해하는 한 문제를 해결하지 못합니다. 감사합니다. – mihe

1

않을까요이 작품?

private void NumericUpDown1_ValueChanged(Object sender, EventArgs e) 
{ 
    if(NumericUpDown1.Value >= 0 && NumericUpDown1.Value < 5) 
    { 
     NumericUpDown1.Increment = 0.01; 
    } 
    if(NumericUpDown1.Value >= 5 && NumericUpDown1.Value < 20) 
    { 
     NumericUpDown1.Increment = 0.04; 
    } 
} 
관련 문제