2009-04-20 5 views
7

이것은 쉬워야하는 것처럼 보입니다. 그러나 여기서 일어날 일이 무엇인지 알아내는 데 어려움을 겪고 있습니다.C#에서 "키"열거 형 값을 "int"문자로 변환하려면 어떻게해야합니까?

"KeyDown"이벤트 처리기에서 "e.KeyValue"가 숫자 인 경우이를 숫자로 처리하여 int로 저장하려고합니다. 따라서 숫자 패드에서 "8"을 누르는 경우 "Numpad8"을 추가하거나 뺄 수있는 int 값 8을 원하지 않습니다.

그래서 KeyValue를 int로 변환하려면 어떻게해야합니까?

답변

14

나는이 솔루션과 함께 가고 싶어요 : 포인트가 펀칭 된 그들은 키의 라벨의 숫자 값을 얻을 수 있다면 ...

int value = -1; 
if (e.KeyValue >= ((int) Keys.NumPad0) && e.KeyValue <= ((int) Keys.NumPad9)) { // numpad 
    value = e.KeyValue - ((int) Keys.NumPad0); 
} else if (e.KeyValue >= ((int) Keys.D0) && e.KeyValue <= ((int) Keys.D9)) { // regular numbers 
    value = e.KeyValue - ((int) Keys.D0); 
} 

+3

숫자 대신에 열거 형을 사용하여 읽기 쉽도록하는 이유는 무엇입니까? "> = (int) Keys.D0"및 "> = (int) Keys.Numpad0"등 ... –

+4

이 코드에는 많은 마법의 숫자가 있습니다. Keys.X 열거 형을 사용하면 훨씬 더 명확 해집니다. –

+0

나는 그 것을 생각하고 있었지만 이것이 내가 필요한 것입니다. 감사! –

2

얼마나 많은 키를 추적 하느냐에 따라 가장 간단한 방법은 keydown의 값을 확인하고 그 값에 따라 select case (또는 C#의 switch 문을 작성하는 것)를 작성하는 것입니다. 적절한 정수에 값을 할당하십시오.

+0

어 ... 나는 할 수 있지만 너무 더럽다. 키보드 위의 숫자와 숫자를 확인해야합니다. 공통적으로 느껴지는 것만 큼 많은 것을 확인하는 것 같습니다. –

+1

그것이 당신에게 그렇게 보일지 모르지만, 이것이 일반적이라면 나는 아주 놀랄 것입니다. 가장 가까운 곳은 입력 된 문자열에서 숫자 값을 파싱하는 것입니다. –

+0

아담의 대답은 그 설명에 더 자세히 나와 있습니다. ASCII를 원한다면별로 어려움없이 값을 얻을 수 있습니다. 그러나 숫자 표현으로 변환하려는 경우에는 그 안에 몇 가지 작업을해야합니다. 모든 것이 자동으로 원하는대로 변환되는 것은 아닙니다. – TheTXI

-3

int i = (int) e.KeyValue;

+0

내가 명확히하자 : 위의 "숫자 패드 8"의 예제를 사용하면 int 값은 104이므로 코드를 사용하는 값은 104이지만 실제 값은 8이됩니다. –

2

숫자 값을 원할 경우 switch(e.KeyCode) 문을 작성하고 키를 평가하고 고유 한 int를 작성해야합니다. Keys을 키의 숫자를 나타내는 숫자 값으로 변환하는 간단한 방법은 없습니다. 당신이 얻을 수있는 가장 가까운 것은 여전히 ​​번역되어야 할 ASCII 등가물 일 수 있습니다.

+0

간단한 수학 모든 가치에 대한 전환보다 훨씬 낫습니다. 아래에서 확인하십시오. –

+0

당신은 당신 자신의 답변을 게시했습니다 ... 당신 자신의 관심을 끌기 위해 다른 사람들의 의견을 말할 필요는 없습니다. –

+0

감사합니다. Adam. 하지만 그것은 내 의도가 아니 었습니다. 누군가이 게시물을 읽고 마음에 들었다면, 나는 답을 찾았는지 아닌지 switch 문구 아이디어에서 제외하고 싶었습니다. –

1

당신은들을 수 없습니다. KeyPress 이벤트 대신에? 그것은 실제로 눌러 진 캐릭터를 줄 것입니다.

+0

그 데이터를 사용하는 방법이 여전히 누락되었습니다. 나는 그가 KeyPress 이벤트를 사용해야하고 int를 수행한다고 가정합니다. TryParse on it? –

0

KeyValue는 누른 키의 문자 코드를 나타냅니다. 숫자 값을 얻으려면 눌린 키의 문자를 찾은 다음 문자에서 정수로 파싱해야합니다. Convert.ToInt32 같은

뭔가 (e.KeyCode.ToString는())

1

이 기능을 사용하면 원하는 것을 할 것입니다 :

private int GetKeyValue(int keyValue) 
{ 
    if (keyValue >= 48 && keyValue <= 57) 
    { 
     return keyValue - 48; 
    } 
    else if (keyValue >= 96 && keyValue <= 105) 
    { 
     return keyValue - 96; 
    } 
    else 
    { 
     return -1; // Not a number... do whatever... 
    } 
} 

지금처럼 전화 :

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    int num = GetKeyValue(e.KeyValue); 
} 
+0

정말 좋은 코드가되기 위해이 함수에 너무 많은 하드 코딩이 있습니다. 아래에서 수정 된 버전을 확인하십시오. –

+0

사실,하지만 이것은 매우 단순한 주석이 누구에게 정확히 무엇을 알려줄 수있는 하찮은 기능입니다. –

5

뭔가 이렇게하면 잘 작동합니다. (수정 됨)

int keyVal = (int)e.KeyValue; 
int value = -1; 
if ((keyVal >= (int)Keys.D0 && keyVal <= (int)Keys.D9) 
{ 
    value = (int)e.KeyValue - (int)Keys.D0; 
} 
else if (keyVal >= (int)Keys.NumPad0 && keyVal <= (int)Keys.NumPad9) 
{ 
    value = (int)e.KeyValue - (int)Keys.NumPad0; 
} 
+0

+1 실제로 열거 형을 사용합니다! 어떻게 다른 사람이 그렇게하고 싶어하지 않습니까? –

+0

범위 (D0뿐만 아니라 D0 또는 NumPad0)에 따라 빼야합니다. –

+0

또한 작은 수정 사항이있는 WPF에서 작동합니다. –

0

아니면 확장 메서드를 작성하고 확장 방법은

public static class MyExtensions 
{ 
    public static int GetKeyValue(this int keyValue) 
    { 

     if (keyValue >= 48 && keyValue <= 57) 
     { 
      return keyValue - 48; 
     } 
     else if (keyValue >= 96 && keyValue <= 105) 
     { 
      return keyValue - 96; 
     } 
     else 
     { 
      return -1; // Not a number... do whatever... } 

     } 
    } 
} 
4

현황입니다

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{  
    int num = e.KeyValue.GetKeyValue(); 
} 

처럼 전화 : 키보드 키가 있습니다. 일부 키는 숫자를 나타내며 일부 키는 숫자를 나타냅니다.

문제 (수정) : 키가 숫자 인 경우 키로 표시되는 숫자 값을 나타냅니다.

문제를 해결하려면 각 키 (모든 키의 집합 중)가 숫자를 나타내는 것은 물론 각 (숫자) 키가 나타내는 정확한 숫자 값을 알아야합니다.

내 지식으로는 프레임 워크에서 이러한 매핑을 쉽게 얻을 수있는 방법이 없습니다.

참고 : 키 열거에서 D0-D9 및 NumPad0-NamPad9가 연속적이라는 사실은 실수로 발생하며 순차적으로 정렬 된 이러한 값에 의존한다는 근거는 없습니다.

그래서 해결책은 다음과 같습니다 지정된 키가 숫자를 나타내는 경우

  1. 가 결정합니다.
  2. 키가 숫자 인 경우 키의 숫자 값을 반환합니다.

솔루션 밀접 모델
private static readonly IDictionary<Keys, int> NumericKeys = 
    new Dictionary<Keys, int> { 
     { Keys.D0, 0 }, 
     { Keys.D1, 1 }, 
     { Keys.D2, 2 }, 
     { Keys.D3, 3 }, 
     { Keys.D4, 4 }, 
     { Keys.D5, 5 }, 
     { Keys.D6, 6 }, 
     { Keys.D7, 7 }, 
     { Keys.D8, 8 }, 
     { Keys.D9, 9 }, 
     { Keys.NumPad0, 0 }, 
     { Keys.NumPad1, 1 }, 
     { Keys.NumPad2, 2 }, 
     { Keys.NumPad3, 3 }, 
     { Keys.NumPad4, 4 }, 
     { Keys.NumPad5, 5 }, 
     { Keys.NumPad6, 6 }, 
     { Keys.NumPad7, 7 }, 
     { Keys.NumPad8, 8 }, 
     { Keys.NumPad9, 9 } 
    }; 

private int? GetKeyNumericValue(KeyEventArgs e) { 
    if (NumericKeys.ContainsKey(e.KeyCode)) return NumericKeys[e.KeyCode]; 
    else return null; 
} 

틀림없이이 아닌 간단한 솔루션,하지만 하나.

+0

확장 메소드로 사용했습니다. 여기에 훌륭한 해결책이 많이 있지만 이것은 가장 깨끗한 것 같습니다. 감사. –

+0

저에게 맞습니다. 감사. – rajibdotnet

관련 문제