퇴근5분전

 

 플젝중에 난간함 상황이 생겼다.

금액과 관련된 TextBox Field에 TextBox를 넣었기에 숫자이외에 영어 한글 모두 입력이 되는 부분..

물론 개발프레임웍에 숫자관련 컨트롤이 사용자정의를 통해 만들어져 있다. 사용하지 않는 분위기...?

 

 기존 디자인에 거의 모두 Textbox가 되어 있기에 이것을 이용해서 숫자이외에 차단!!

이건 의외로 간단히 처리가 되었고...

  PreviewKeyDown을 이용해서 필터링을 거쳤다.

 

다만 문득 떠오르는게...

 

DB의 데이타 타입과 C#의 데이타 타입이 허용범위가 다르다는 것이었는데???

 

Numeric( 5, 3 ) 를 DB에 넣으면서... !!!!

 

C#에서 단순히 double로 처리해서 파라미터 넘겨주면??

 

Numeric( 18, 2 ) 에서 ... Decimal로 처리는 했는데...

 

단순 데이타 처리를 저렇게 한다고 해도... 그럼.. TextBox의 입력은???

 

음.. 그래서 생각한게 maxLength를 지정하고 scale이 있으면 소숫점 자리와 마이너스표시 자리수 까지 maxLength로 잡아주었다.

 

Numeric( 5, 3 )의 DB에 준비가 되었을때...

 

입력은 MaxLength = 7이 되었다.

 

그리고 계산해서 최대값을 보니 99.999 최소값은 -99.999 ,  MsSql에서 직접 테스트 해보니 100은 못넣더랑...

 

그래서 입력은 실제로 9999999 까지 입력을 받을 수 있다.

 

고럼... keydown할때 다음 값을? 계산해서 범위에 맞지 않으면 cancel 처리 하려고 했는데...

 

배보다 배꼽이 되겠다..

 

그래서 생각한게 그냥 저장전에 유효성체크를 범위를 포함해서 한번 더 하자... 였다.

 

 tb1.EventAttachedForNumericInputFormat((e) => { }, 5, 3); // Numeric( 5, 3 )을 범위로 입력가능 -99.999 ~ 99.999
 tb2.EventAttachedForNumericInputFormat((e) => { }, "N0", 0, 10); // 0~10 까지 범위를 가진 2자리 입력가능 0 ~ 10

 

이렇게 해당 텍스트박스에 확장메서드로 구현해두면... 숫자 포멧도 되고! 범위도 체크가 되고...

 

저장전 유효성 체크는

 

 // 0~100범위 내에 있으므로 pass

 if (TextBoxWPF_Ex.IsCheckNumberRange("99", 0m, 100m) == false) {
         MessageBox.Show("허용범위 밖입니다.");
 }

 

 //-99.999~99.999 범위 밖이므로 alert

 if (TextBoxWPF_Ex.IsCheckNumberRange("100", 5, 3) == false)
 {
        MessageBox.Show("허용범위 밖입니다.");
 }

 

 // pass

 if (TextBoxWPF_Ex.IsCheckNumberRange("99", (decimal)int.MinValue, (decimal)int.MaxValue) == false)
 {
        MessageBox.Show("허용범위 밖입니다.");
 }

 

 여기서 한가지 맹점.이...   int, int 타입으로 prev, scale을 받고, decimal , decimal로 min, max를 받아서

하나의 메서드를 오버로드 시켰더니...

 

 int.MinValue와 int.MaxValue가 사용되는 db에서의 int의 범위에 대하여 넣을땐! 위처럼 decimal로 치환을 해야된다..

 

 안그러면 prev가 int.minValue 만큼.. scale이 int.MaxValue 만큼 잡아서 OutOfMemory 메세지를 보게 된다.

 

너무 급조해서 앞으로 좀더 고쳐봐야지... 쉽게...  winform용도 하나 만들어놔야징.

 

##### 추가

 

입력 숫자 자체를 범위에서 제한 하도록 수정!!

 

                    string x = txt.Text;
                    string xx = x.Remove(txt.CaretIndex, txt.SelectionLength);
                    if (e.Key == Key.Back && txt.SelectionLength <= 0 && (txt.CaretIndex - 1 >= 0))
                    {
                        // 1 char 삭제
                        xx = x.Remove(txt.CaretIndex - 1, 1);
                    }
                    else if (e.Key == Key.Delete && (txt.CaretIndex) < txt.Text.Length)
                    {
                        // 1 char 삭제
                        xx = x.Remove(txt.CaretIndex, 1);
                    }
                    else
                        xx = xx.Insert(txt.CaretIndex, GetChar(e.Key));

                    e.Handled = !IsCheckNumberRange(xx, minValue, maxValue);

 

이렇게 하면 입력된 숫자를 포함해서 범위를 체크할수 있다.

 

key처리전에 N0 포멧일경우 소숫점(.) 에 대한 예외 처리를 해주면 깔끔해진다.

 

또 처리 할 것이 남았다. 입력범위 밖에 숫자를 입력했을 경우 어떻게 알려줄것인가???

 

툴팁? Alert? 색상?...