2009-04-20 15 views
7

ऐसा लगता है कि यह आसान होना चाहिए, लेकिन मुझे यह पता लगाना मुश्किल हो रहा है कि यहां क्या होने की आवश्यकता है।मैं "कुंजी" एनम मान को सी # में "int" वर्ण में कैसे परिवर्तित करूं?

"कीडाउन" घटनास्थल में, यदि "ई। केवेलव्यू" एक संख्या है, तो मैं इसे एक संख्या के रूप में देखना चाहता हूं और इसे एक int के रूप में स्टोर करना चाहता हूं। इसलिए, यदि मैंने संख्या पैड पर "8" मारा है, तो मैं नहीं चाहता कि "नम्पैड 8" मैं 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

क्यों संख्याओं के स्थान पर enums का उपयोग नहीं करते हैं ताकि यह अधिक पठनीय हो? "> = (int) Keys.D0" और "> = (int) Keys.Numpad0" आदि ... –

+4

इस कोड में बहुत से जादू संख्याएं हैं। Keys.X गणनाओं का उपयोग करना बहुत स्पष्ट है। –

+0

मैं उस चीज़ को बहुत सोच रहा था, लेकिन मुझे यही चाहिए। धन्यवाद! –

2

इस पर निर्भर करते हुए कि आप कितनी कुंजी ट्रैक कर रहे हैं, सबसे आसान तरीका आपके लिए एक चुनिंदा केस (या सी # अनुमान में स्विच स्टेटमेंट) बनाना होगा जो आपके कीडाउन के मूल्य की जांच करेगा और उस मान के आधार पर उपयुक्त एक पूर्णांक को मान असाइन करें।

+0

उह ... मैं ऐसा कर सकता हूं, लेकिन यह बहुत गंदा लगता है। मुझे कीबोर्ड के ऊपर numpad मानों और अन्य संख्याओं दोनों की जांच करनी होगी। ऐसा लगता है कि ऐसा कुछ ऐसा लगता है जो सामान्य होना चाहिए। –

+1

हालांकि यह आपके लिए ऐसा प्रतीत हो सकता है, अगर यह बिल्कुल आम था तो मुझे आश्चर्य होगा। आप जो निकटतम आ सकते हैं वह किसी स्ट्रिंग से एक संख्यात्मक मान पार्स करेगा जो दर्ज किया गया था। –

+0

एडम का जवाब स्पष्टीकरण में आगे जाता है। यदि आप एएससीआईआई चाहते हैं तो आप बिना किसी कठिनाई के मूल्य प्राप्त कर सकते हैं, लेकिन यदि आप इसे डिजिटली प्रतिनिधित्व में अनुवाद करना चाहते हैं, तो आपको इसमें कुछ काम करना होगा। आप जो कुछ भी चाहते हैं उसमें स्वचालित रूप से अनुवाद नहीं किया जाएगा। – TheTXI

-3

int i = (int) e.KeyValue;

+0

मुझे स्पष्टीकरण दें: उपरोक्त "संख्या पैड 8" के मेरे उदाहरण का उपयोग करते हुए, इसका int मान 104 है, इसलिए आपके कोड का उपयोग करने वाला मेरा मान 104 होगा, लेकिन मैं वास्तव में मान 8 होना चाहता हूं। –

2

यदि आप NUMERIC मान चाहते हैं, तो आपको switch(e.KeyCode) कथन बनाना होगा और कुंजी का मूल्यांकन करना होगा और अपना स्वयं का int बनाना होगा। Keys को एक संख्यात्मक मान में बदलने के लिए कोई आसान तरीका नहीं है जो कुंजी पर संख्या का प्रतिनिधित्व करता है। जो निकटतम आप प्राप्त कर सकते हैं वह एएससीआईआई समकक्ष हो सकता है, जिसे अभी भी अनुवादित करने की आवश्यकता होगी।

+0

सरल गणित प्रत्येक मूल्य के लिए एक स्विच से काफी बेहतर है। कृपया नीचे जांचें। –

+0

आपने अपना उत्तर पोस्ट किया है ... अपने आप को ध्यान आकर्षित करने के लिए दूसरों में टिप्पणी करना वास्तव में जरूरी नहीं है। –

+0

धन्यवाद एडम। लेकिन वह मेरा इरादा नहीं था। अगर कोई इस पोस्ट को पढ़ता है और इसे पसंद करता है, तो मैं उन्हें स्विच स्टेटमेंट विचार से दूर धक्का देना चाहता था कि उन्हें मेरा जवाब मिला या नहीं। –

1

तुम सिर्फ सुनने की जा सकी। इसके बजाय KeyPress घटना के लिए? यह उस चरित्र को देगा जो वास्तव में दबाया गया था।

+0

आप अभी भी उस डेटा का उपयोग करने के बारे में याद कर रहे हैं। मुझे लगता है कि आप का मतलब है कि उसे कुंजीपटल घटना का उपयोग करना चाहिए और उस पर int.ryparsese करना चाहिए? –

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

सच है, लेकिन यह इतना छोटा काम है कि बहुत ही सरल टिप्पणियां किसी को भी सूचित करती हैं कि यह वास्तव में enums का उपयोग करने के लिए –

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

आपको श्रेणी (डी 0 या न्यूपैड 0, न केवल डी 0) के आधार पर घटाना होगा। –

+0

छोटे बदलावों के साथ WPF के लिए भी काम कर रहा है :) –

0

या एक विस्तार विधि बना सकते हैं और ऐसा लगता है जैसे

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

फोन जहां विस्तार विधि

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

तथ्य है: कीबोर्ड कुंजियां है। कुछ कुंजी संख्याओं का प्रतिनिधित्व करते हैं और कुछ नहीं करते हैं।

समस्या (rephrased): कुंजी एक संख्या का प्रतिनिधित्व करते हुए एक संख्यात्मक मान उत्पन्न करें, यदि कुंजी किसी संख्या का प्रतिनिधित्व करती है।

समस्या को हल करने के लिए यह जानना आवश्यक है कि कौन सी चाबियाँ (सभी चाबियों के सेट से बाहर) संख्याओं का प्रतिनिधित्व करती है और सटीक संख्यात्मक मान प्रत्येक (संख्या) कुंजी का प्रतिनिधित्व करता है।

मेरे ज्ञान के लिए ढांचे से ऐसा मैपिंग प्राप्त करने का कोई आसान तरीका नहीं है।

नोट: तथ्य डी 0-डी 9 और न्यूपैड 0-नामपैड 9 कुंजी क्रम में अनुक्रमिक हैं और आकस्मिक रूप से आदेश दिया जा रहा है इन मूल्यों पर निर्भर है।

तो समाधान होगा:

  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

संबंधित मुद्दे