2008-10-14 8 views
1

J'ai le même problème que décrit dans les messages énumérés ci-dessous. C'est-à-dire que certaines touches ne fonctionnent pas du tout lorsque je les tape dans ma liste déroulante jusqu'à ce que j'appuie sur la barre d'espace pour la première fois. L'une des clés est ".", Mais une autre est la lettre "Q", et il y en a d'autres: "$", "%".Comment pouvez-vous obtenir un enfant ComboBox d'un DataGridView pour traiter toutes les clés, y compris "."?

http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=659716&SiteID=1
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2909173&SiteID=1&pageid=0
http://bytes.com/forum/thread548399.html

J'ai essayé beaucoup de choses jusqu'à présent. Mon dernier échec était basé sur la théorie selon laquelle le DataGridView utilisait WIN32 API sous-classe wndproc pour intercepter les messages, j'ai donc écrit une logique pour sauvegarder l'ancien wndproc et le restaurer après l'avoir ajouté à la collection de contrôle de DataGridView. Cela n'a pas fonctionné. Messine - merci de me rappeler Spy ++. Pour la lettre "A", la fenêtre d'édition envoie un EN_UPDATE à son parent combobox. Mais, pas pour le "Q". C'est tellement étrange. Je me suis convaincu que DataGridView ne sous-classe pas le combo et l'édition, parce que je vérifie l'adresse du wndprocs juste après sa création et avant de les ajouter à la collection de la grille, et plus tard quand je peins. À moins que la grille installe une sorte de crochets globaux ..

Je pense, peut-être que je peux sous-classer le contrôle d'édition, puis envoyer la notification à la liste déroulante comme je vois le contrôle d'édition faire ici?

EDIT: Plus d'infos ici. les messages Windows de grille, combobox et contrôle d'édition, de Spy ++:

hWnds: 122064e < grille 010d0674 < combobox contrôle d'édition de combox

<01402> 01360696 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<01403> 010D0674 S WM_GETDLGCODE 
<01404> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01405> 010D0674 S WM_GETDLGCODE 
<01406> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01407> 010D0674 S WM_GETDLGCODE 
<01408> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01409> 010D0674 S WM_GETDLGCODE 
<01410> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01411> 01360696 P WM_CHAR chCharCode:'0061' (97) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<01412> 010D0674 S WM_GETDLGCODE 
<01413> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01414> 010D0674 S WM_GETDLGCODE 
<01415> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 

<01416> 010D0674 S WM_COMMAND wNotifyCode:EN_UPDATE wID:1001 hwndCtl:01360696 <<< edit control sends to combobox 

<01417> 010D0674 S message:0x2111 [User-defined:WM_USER+7441] wParam:00060674 lParam:010D0674 What do these do? 
<01418> 010D0674 R message:0x2111 [User-defined:WM_USER+7441] lResult:00000000 

<01419> 010D0674 R WM_COMMAND 
<01420> 010D0674 S WM_CTLCOLOREDIT hdcEdit:C7011AA6 hwndEdit:01360696 
<01421> 010D0674 R WM_CTLCOLOREDIT hBrush:F0103EB0 

<01422> 010D0674 S WM_COMMAND wNotifyCode:EN_CHANGE wID:1001 hwndCtl:01360696 << edit control sends to combobox 

<01423> 010D0674 S message:0x2111 [User-defined:WM_USER+7441] wParam:00050674 lParam:010D0674 

<01424> 0122064E S WM_PAINT hdc:00000000 <<< grid is told to paint 
<01425> 0122064E S WM_ERASEBKGND hdc:94011D4E 
<01426> 0122064E R WM_ERASEBKGND fErased:True 
<01427> 0122064E S WM_GETTEXTLENGTH 
<01428> 0122064E R WM_GETTEXTLENGTH cch:0 
<01429> 0122064E S WM_GETTEXT cchTextMax:2 lpszText:0012D0C0 
<01430> 0122064E R WM_GETTEXT cchCopied:0 lpszText:0012D0C0 ("") 
<01431> 0122064E S WM_GETTEXTLENGTH 
<01432> 0122064E R WM_GETTEXTLENGTH cch:0 
<01433> 0122064E S WM_GETTEXT cchTextMax:2 lpszText:0012D0C0 
<01434> 0122064E R WM_GETTEXT cchCopied:0 lpszText:0012D0C0 ("") 
<01435> 010D0674 S WM_WINDOWPOSCHANGING lpwp:0012D4B0 
<01436> 010D0674 R WM_WINDOWPOSCHANGING 
<01437> 010D0674 S CB_GETCURSEL 
<01438> 010D0674 R CB_GETCURSEL index:CB_ERR 
<01439> 010D0674 S WM_GETTEXTLENGTH 
<01440> 01360696 S WM_GETTEXTLENGTH 
<01441> 01360696 R WM_GETTEXTLENGTH cch:2 
<01442> 010D0674 R WM_GETTEXTLENGTH cch:2 
<01443> 010D0674 S WM_GETTEXT cchTextMax:6 lpszText:0012CC44 
<01444> 01360696 S WM_GETTEXT cchTextMax:6 lpszText:0012BE64 
<01445> 01360696 R WM_GETTEXT cchCopied:2 lpszText:0012BE64 ("a") 
<01446> 010D0674 R WM_GETTEXT cchCopied:2 lpszText:0012CC44 ("a") 
<01447> 010D0674 S CB_GETCURSEL 
<01448> 010D0674 R CB_GETCURSEL index:CB_ERR 
<01449> 010D0674 S WM_GETTEXTLENGTH 
<01450> 01360696 S WM_GETTEXTLENGTH 
<01451> 01360696 R WM_GETTEXTLENGTH cch:2 
<01452> 010D0674 R WM_GETTEXTLENGTH cch:2 
<01453> 010D0674 S WM_GETTEXT cchTextMax:6 lpszText:0012CC44 
<01454> 01360696 S WM_GETTEXT cchTextMax:6 lpszText:0012BE64 
<01455> 01360696 R WM_GETTEXT cchCopied:2 lpszText:0012BE64 ("a") 
<01456> 010D0674 R WM_GETTEXT cchCopied:2 lpszText:0012CC44 ("a") 
<01457> 010D0674 S CB_GETCURSEL 
<01458> 010D0674 R CB_GETCURSEL index:CB_ERR 
<01531> 0122064E R WM_PAINT 
<01532> 010D0674 S WM_PAINT hdc:00000000 
<01533> 010D0674 S WM_NCPAINT hrgn:00000001 
<01534> 010D0674 R WM_NCPAINT 
<01535> 010D0674 S WM_ERASEBKGND hdc:0F0141ED 
<01536> 010D0674 R WM_ERASEBKGND fErased:True 
<01537> 0122064E S WM_CTLCOLOREDIT hdcEdit:840137F1 hwndEdit:010D0674 
<01538> 0122064E R WM_CTLCOLOREDIT hBrush:F0103EB0 
<01539> 010D0674 R WM_PAINT 
<01540> 01360696 S WM_PAINT hdc:00000000 
<01541> 01360696 S WM_NCPAINT hrgn:00000001 
<01542> 01360696 R WM_NCPAINT 
<01543> 01360696 S WM_ERASEBKGND hdc:C7011AA6 
<01544> 01360696 R WM_ERASEBKGND fErased:True 
<01545> 010D0674 S WM_CTLCOLOREDIT hdcEdit:870137F1 hwndEdit:01360696 
<01546> 010D0674 R WM_CTLCOLOREDIT hBrush:F0103EB0 
<01547> 010D0674 S WM_CTLCOLOREDIT hdcEdit:870137F1 hwndEdit:01360696 
<01548> 010D0674 R WM_CTLCOLOREDIT hBrush:F0103EB0 
<01549> 01360696 R WM_PAINT 
<01555> 0122064E S WM_CTLCOLOREDIT hdcEdit:8A0137F1 hwndEdit:010306AC 
<01556> 0122064E R WM_CTLCOLOREDIT hBrush:78103C5B 
<01568> 010D0674 S CB_GETCURSEL 
<01569> 010D0674 R CB_GETCURSEL index:CB_ERR 
<01570> 010D0674 S WM_GETTEXTLENGTH 
<01571> 01360696 S WM_GETTEXTLENGTH 
<01572> 01360696 R WM_GETTEXTLENGTH cch:2 
<01573> 010D0674 R WM_GETTEXTLENGTH cch:2 
<01574> 010D0674 S WM_GETTEXT cchTextMax:6 lpszText:0012D7A4 
<01575> 01360696 S WM_GETTEXT cchTextMax:6 lpszText:0012C9C4 
<01576> 01360696 R WM_GETTEXT cchCopied:2 lpszText:0012C9C4 ("a") 
<01577> 010D0674 R WM_GETTEXT cchCopied:2 lpszText:0012D7A4 ("a") 
<01578> 010D0674 S CB_GETCURSEL 
<01579> 010D0674 R CB_GETCURSEL index:CB_ERR 
<01580> 010D0674 S WM_GETTEXTLENGTH 
<01581> 01360696 S WM_GETTEXTLENGTH 
<01582> 01360696 R WM_GETTEXTLENGTH cch:2 
<01583> 010D0674 R WM_GETTEXTLENGTH cch:2 
<01584> 010D0674 S WM_GETTEXT cchTextMax:6 lpszText:0012D6E0 
<01585> 01360696 S WM_GETTEXT cchTextMax:6 lpszText:0012C900 
<01586> 01360696 R WM_GETTEXT cchCopied:2 lpszText:0012C900 ("a") 
<01587> 010D0674 R WM_GETTEXT cchCopied:2 lpszText:0012D6E0 ("a") 
<01588> 010D0674 S CB_GETCURSEL 
<01589> 010D0674 R CB_GETCURSEL index:CB_ERR 
<01590> 010D0674 S WM_GETTEXTLENGTH 
<01591> 01360696 S WM_GETTEXTLENGTH 
<01592> 01360696 R WM_GETTEXTLENGTH cch:2 
<01593> 010D0674 R WM_GETTEXTLENGTH cch:2 
<01594> 010D0674 S WM_GETTEXT cchTextMax:6 lpszText:0012D6E0 
<01595> 01360696 S WM_GETTEXT cchTextMax:6 lpszText:0012C900 
<01596> 01360696 R WM_GETTEXT cchCopied:2 lpszText:0012C900 ("a") 
<01597> 010D0674 R WM_GETTEXT cchCopied:2 lpszText:0012D6E0 ("a") 
<01598> 010D0674 R message:0x2111 [User-defined:WM_USER+7441] lResult:00000000 
<01599> 01360696 S WM_GETTEXTLENGTH 
<01600> 01360696 R WM_GETTEXTLENGTH cch:2 
<01601> 01360696 S WM_GETTEXT cchTextMax:6 lpszText:0012DF8C 
<01602> 01360696 R WM_GETTEXT cchCopied:2 lpszText:0012DF8C ("a") 
<01603> 010D0674 R WM_COMMAND 
<01604> 01360696 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:1 

Lettre q

<01625> 01360696 P WM_KEYDOWN nVirtKey:'Q' cRepeat:1 ScanCode:10 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<01626> 010D0674 S WM_GETDLGCODE 
<01627> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01628> 010D0674 S WM_GETDLGCODE 
<01629> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01630> 010D0674 S WM_GETDLGCODE 
<01631> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01632> 010D0674 S WM_GETDLGCODE 
<01633> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01634> 01360696 P WM_CHAR chCharCode:'0071' (113) cRepeat:1 ScanCode:10 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 
<01635> 010D0674 S WM_GETDLGCODE 
<01636> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01637> 010D0674 S WM_GETDLGCODE 
<01638> 010D0674 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<01640> 01360696 P WM_KEYUP nVirtKey:'Q' cRepeat:1 ScanCode:10 fExtended:0 fAltDown:0 fRepeat:1 fUp:1 
+0

J'ai essayé l'exemple du forum bytes.com, et il ne fonctionne pas pour moi. Je serais heureux de donner un peu de code si vous avez des étapes de repro. –

+0

Je suis venu ici à la recherche du message 'S: 0x2111 [défini par l'utilisateur: WM_USER + 7441]' mais de toute façon je parie que je peux deviner ce qui se passe. Les clés qui vous manquent sont déjà mappées. Peut-être que Ctrl + Q = quitter. La combox ne gère pas bien les raccourcis clavier. –

Répondre

1

Par hasard, avez-vous déjà résolu votre problème?

J'ai le même problème que le vôtre, mon contrôle personnalisé pour DataGridView ne peuvent pas recevoir la lettre Q, période, dollar, guillemet simple, pour cent, etc.

j'ai pu résoudre le problème en changeant le « commutateur. default: retourne false "to" switch .. par défaut: return! dataGridViewWantsInputKey "

Je suppose que le code de patron de Microsoft pour créer votre propre commande usercontrol pour datagridview n'est pas optimal.Voici le code de modèle de Microsoft:

http://msdn.microsoft.com/en-au/library/7tas5c80(vs.80).aspx

public bool EditingControlWantsInputKey(
    Keys key, bool dataGridViewWantsInputKey) 
{ 
    // Let the DateTimePicker handle the keys listed. 
    switch (key & Keys.KeyCode) 
    { 
     case Keys.Left: 
     case Keys.Up: 
     case Keys.Down: 
     case Keys.Right: 
     case Keys.Home: 
     case Keys.End: 
     case Keys.PageDown: 
     case Keys.PageUp: 
      return true; 
     default: 
      return false; // I changed this to: return !dataGridViewWantsInputKey. My usercontrol can now receive Q, period, dollar, etc. 
    } 
} 
+0

Je n'ai pas résolu le problème. J'ai essayé votre solution et cela ne fonctionne pas pour moi, et après y avoir réfléchi, je ne suis pas surpris. J'utilise la liste déroulante dans l'en-tête, pas une cellule régulière. Je ne pense pas que ma grille connaisse assez bien ma combobox pour découvrir et utiliser son interface IDataGridViewEditingControl. Je veux dire, je pense que j'ai plus de problèmes que juste ce problème. Je vais quand même marquer votre réponse comme la réponse acceptée. –

0

Réponse partielle à ma question. Dans le Combobox, je gère les événements KeyDown, TextChanged et KeyUp, qui se déclenchent dans cet ordre. Si je passe de KeyDown à KeyUp avec TextChanged, je vérifie si le caractère était Keys.Q ou Keys.OemPeriod. (Je ne suis pas sûr que c'est sûr pour d'autres, comme shift/D1, shift/D2, etc ...). Si c'est une de ces touches, je change le texte de la combobox moi-même.

Mais cela ne suffit pas, car le simple fait de changer le texte place le curseur dans le contrôle d'édition (qui appartient à la liste déroulante) au début du texte. Donc, pour résoudre ce problème, j'utilise FindWindowEx pour obtenir le handle du contrôle d'édition, puis j'envoie un EM_SETSEL pour réinitialiser le curseur à la fin du mot.

Questions connexes