10
votes

Événement clé - Comment savoir facilement si la touche appuyée est numérique?

Je gère actuellement l'événement de clé d'un contrôle DataGridView. L'une des colonnes est remplie de valeurs calculées et je souhaite que l'utilisateur puisse remplacer la valeur de la cellule si elles veulent.

Lorsque l'utilisateur appuie sur une touche numérique, la cellule passe dans EditMode et permet à l'utilisateur de remplacer la valeur. . Si la clé n'est pas numérique, rien ne se passe ... p>

qui fonctionne assez bien ... Le problème est que je trouve le code pour ça laid ... Je ne peux pas sembler trouver un moyen net de gérer toutes les touches numériques en une seule condition. J'ai donc fait une construction de cas de commutation pour traiter toutes les touches numériques possibles, comme celle-ci: P>

                switch (e.KeyCode)
                {
                    case Keys.D0:
                    case Keys.D1:
                    case Keys.D2:
                    case Keys.D3:
                    case Keys.D4:
                    case Keys.D5:
                    case Keys.D6:
                    case Keys.D7:
                    case Keys.D8:
                    case Keys.D9:
                    case Keys.Decimal:
                    case Keys.NumPad0:
                    case Keys.NumPad1:
                    case Keys.NumPad2:
                    case Keys.NumPad3:
                    case Keys.NumPad4:
                    case Keys.NumPad5:
                    case Keys.NumPad6:
                    case Keys.NumPad7:
                    case Keys.NumPad8:
                    case Keys.NumPad9:

                         [code to make the cell go to editMode, etc...]


0 commentaires

8 Réponses :


2
votes

sur le Page d'aide MSDN Ils utilisent ce code dans leur exemple: xxx

... xxx


5 commentaires

@Rawling, @tanascius: Merci, j'ai pensé à cela, mais je pensais que c'était une mauvaise pratique pour effectuer des évaluations de la portée contre les énumérations? Je conviens que le fait qu'il vient de MSDN le rend relativement sûr, mais après tout, ce ne serait pas la première fois que nous verrions un mauvais exemple de code de MSDN ... Y a-t-il quelque chose qui garantit que les valeurs seront toujours contiguës ? Après tout, nous avons des énumérations afin de ne pas compter sur les valeurs sous-jacentes? En effectuant un tel chèque, je ne sais pas sur le fait que ces valeurs d'énumérations seront contiguës les unes aux autres? Merci.


En tant que métier, j'espère que, puisque Microsoft utilise cela dans leur docs, ils feraient attention à garder le comportement cohérent. Si vous pouvez passer à l'événement KeyPress au lieu de la clé, vous pouvez utiliser la solution que j'ai fournie.


Oui, s'il y a une raison de ne pas le faire, la solution de Tim est bonne - et le rend beaucoup plus évident ce que vous essayez de faire, aussi.


@Kharlos: Je comprends les problèmes que vous avez, mais pensez à ce qu'ils devraient changer pour faire une pause de code. L'ENUM peut changer sans problème tant qu'ils ne changent pas l'ordre du Numpad? et d? éléments. Et je pense qu'il n'y a aucune raison de définir numpad9 avant "numpad8 ...


Oui, je suis d'accord avec vous qui est très peu probable qu'ils le feraient. C'est plus une question rhétorique qu'un monde réel, mais si je peux, je pourrais aussi bien essayer de ne pas rompre une meilleure pratique, même si cela est peu probable, cela poserait un problème dans le monde réel.



18
votes

Essayez xxx


1 commentaires

Les ans marqués sont corrects mais - Telerik Grid ne prendra pas en charge KeyPress .. Cela fonctionne!



13
votes

Si vous utilisez l'événement KeyPress CODE>, la signature d'événement a un keighpressereventargs code> avec un membre KeyCharner code> qui vous donne le caractère des touches numériques. . Vous pouvez faire une trypaitance à ce sujet pour déterminer si son numéro ou non.

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    int i;
    if (int.TryParse(e.KeyChar.ToString(), out i))
    {
        MessageBox.Show("Number");
    }
}


1 commentaires

Merci tim and Rawling. C'est la solution que je suis allé avec. Je dois aussi gérer un événement de clé de del en clé ... J'aurais préféré tout garder au même endroit, mais ce code regarde de loin le plus gentil. Merci à tous les autres aussi.



0
votes
void dataGridView1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    // Used this to find they key values.
    //label1.Text += e.KeyValue;

    // Check if key is numeric value.
    if((e.KeyValue >= 48 && e.KeyValue <= 57) || (e.KeyValue >= 97 && e.KeyValue <= 105))
        System.Console.WriteLine("Pressed key is numeric");
}

1 commentaires

Faites attention à l'aide de cette méthode car elle ne prend pas en compte les valeurs de bloc-notes (numpad0 = 96 = 'd')



7
votes

Pourquoi utiliser des codes clés, lorsque vous pouvez utiliser ceci:

void Control_KeyPress(object sender, KeyPressEventArgs e)
    {

        if (Char.IsDigit(e.KeyChar))
        {
            //do something
        }
        else
        {
            //do something else
        }
    }


0 commentaires

8
votes

La solution de Sorcerer86PT était la plus simple, toutefois, lorsqu'un utilisateur appuie une touche de contrôle, comme le retour arrière, il se casse. Pour résoudre ce problème, vous pouvez utiliser l'extrait suivant:

void ValidateKeyPress(object sender, KeyEventArgs e)
{
    char keyPressed = WPFUtils.Interop.Keyboard.GetCharFromKey(e.Key);
    if (!Char.IsNumber(keyPressed) && !Char.IsControl(keyPressed))
    {
        //As above
        e.Handled = true;
        return;
    }
}


0 commentaires

2
votes

Obtenez simplement le dernier caractère de la clé qui sera numéro si un numéro a été enfoncé. Cette méthode fonctionne avec des événements de clé à ne pas avoir besoin d'autres conditions.

Appelez simplement cette méthode statique et passez la clé pour vérifier P>

public static bool IsNumber(Keys key)
{
  string num = key.ToString().Substring(key.ToString().Length - 1);
  Int64 i64;
  if (Int64.TryParse(num, out i64))
  {
    return true;               
  }
  return false;
}


0 commentaires

2
votes

Un peu plus de version condensée: xxx


1 commentaires

Tout comme une note ajoutée, cela interdire la touche de retour arrière à appuyer sur une touche autre que les chiffres autres que les chiffres.