簡體   English   中英

如何在 C# 中將“Keys”枚舉值轉換為“int”字符?

[英]How do I convert a "Keys" enum value to an "int" character in C#?

這似乎應該很容易,但我很難弄清楚這里需要發生什么。

在“KeyDown”事件處理程序中,如果“e.KeyValue”是一個數字,我想將其視為一個數字並將其存儲為一個 int。 所以,如果我在數字鍵盤上點擊“8”,我不想要“Numpad8”,我想要可以添加或減去的 int 值 8 等等。

那么,如何將 KeyValue 轉換為 int?

我會采用以下解決方案:

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);
}

...如果重點是要獲取打入的鍵的標簽的數值。

這樣的事情應該可以正常工作:(已編輯)

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;
}

事實:鍵盤有按鍵。 有些鍵代表數字,有些則不能。

問題(改寫):如果鍵代表數字,則產生由鍵代表的數字值。

為了解決該問題,必須知道哪些鍵(在所有鍵集中)代表數字以及每個(數字)鍵代表的確切數值。

據我所知,沒有一種簡單的方法可以從框架中獲得這種映射。

注意:D0-D9和NumPad0-NamPad9在Keys枚舉中是順序的事實是偶然的,並且沒有理由依賴於這些值的順序排序。

所以解決方案是:

  1. 確定給定的鍵是否代表數字。
  2. 如果key代表數字,則返回key的數值。

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;
}

可以說,這不是最簡單的解決方案,而是對解決方案進行建模的一種方法。

根據要跟蹤的鍵數,最簡單的方法是為您創建一個選擇案例(我猜是C#中的switch語句?),該案例將檢查keydown的值,並根據該值將值分配給一個合適的整數。

如果需要NUMERIC值,則必須創建一個switch(e.KeyCode)語句並評估鍵並創建自己的int。 沒有簡單的方法可以將“ Keys轉換為代表Keys數字的數字值。 您可以獲得的最接近的值可能是ASCII等效值,仍然需要翻譯。

您可以只聽KeyPress事件嗎? 它將給出實際按下的字符。

此函數將執行您想要的操作:

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);  
}

我使用了以下兩行簡單代碼:

string key = e.KeyCode.ToString();

if (key.Length > 1) key = key.Replace("NumPad", "").Replace("D", "");

這是獲取可用值的另一種方法:

string key
if (((int)e.Key < 84 && (int)e.Key > 73) || ((int)e.Key < 44 && (int)e.Key > 33))
{
    key = ((int)e.Key - 4).ToString();
    key = key.Remove(0,1);
}

替代 Carlos Ferreira 發布的內容。

KeyValue表示所按下鍵的字符代碼。 為了獲得其數字值,您應該找到所按下鍵的字符,然后將其從字符解析為整數。

像Convert.ToInt32(e.KeyCode.ToString())之類的東西

或創建一個擴展方法並像調用它一樣

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...    }

        }
    }
}

int i =(int)e.KeyValue;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM