2010-07-04 4 views
1

J'ai un DataGridView avec une colonne de cellules de zone de texte qui doivent avoir un texte en filigrane. J'ai aussi une classe statique qui utilise DLLImport pour ajouter un filigrane à une zone de texte en utilisant SendMessage avec un hWnd IntPtr comme l'un des paramètres, comme ceci:Obtenir un handle IntPtr à partir d'un DataGridViewTextBoxCell?

public static void SetWatermark(TextBox textBox, string watermarkText) 
    { 
     SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText); 
    } 

Le problème est, alors que la zone de texte hérite de la propriété Control.Handle, DataGridViewTextBoxCell non, donc je ne peux pas obtenir ce paramètre IntPtr. Je comprends que la cellule utilise un contrôle TextBox pour modifier la valeur, donc ne devrait pas y avoir un moyen d'arriver à ce handle?

J'utilise .NET 2.0 et C#

Répondre

2

Si vous voulez une référence à la zone de texte de la cellule actuellement en cours d'édition, vous pouvez utiliser la propriété DataGridView.EditingControl sur le DataGridView lui-même. Placez votre code dans un gestionnaire pour l'événement EditingControlShowing afin qu'il soit appelé chaque fois qu'un nouveau TextBox est affiché.

Bien sûr, vous voulez réellement le filigrane sur les cellules qui ne sont pas en cours d'édition, puisque la cellule en cours d'édition a le focus sur le clavier afin que le filigrane soit caché de toute façon. Les cellules qui ne sont pas en cours de modification n'ont pas de poignées de fenêtre et sont entièrement peintes en code managé. Vous ne pouvez donc pas le faire avec SendMessage. Vous devrez créer une sous-classe de DataGridViewCell et remplacer Paint ou gérer l'événement CellPainting sur DataGridView.

Questions connexes