public static void SetWatermark(TextBox textBox, string watermarkText) { SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText); }
1
0
透かしテキストを必要とするテキストボックスセルの列を持つDataGridViewがあります。 また、DLLImportを使用して、次のようにパラメーターの1つとしてIntPtr hWndを指定したSendMessageを使用してTextBoxに透かしを追加する静的クラスもあります。
public static void SetWatermark(TextBox textBox, string watermarkText) { SendMessage(textBox.Handle, EM_SETCUEBANNER, 0, watermarkText); }
問題は、TextBoxがControl.Handleプロパティを継承するのに対し、DataGridViewTextBoxCellは継承しないため、IntPtrパラメーターを取得できないことです。 セルは値を編集するためにTextBoxコントロールを使用するので、そのHandleに到達する方法はないはずだと理解していますか?
1 Answer
2
現在編集中のセルのTextBoxへの参照が必要な場合は、http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.editingcontrol.aspx [DataGridView.EditingControlを使用できます] DataGridView自体のプロパティ。 新しいTextBoxが表示されるたびに呼び出されるように、http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.editingcontrolshowing.aspx [EditingControlShowing]イベントのハンドラーにコードを配置します。 。
もちろん、編集中のセルにはキーボードフォーカスがあるため、透かしはとにかく非表示になるため、編集されていないセルには実際に透かしが必要です。 編集されていないセルにはウィンドウハンドルがなく、マネージコードで完全にペイントされるため、SendMessageでこれを行うことはできません。 DataGridViewCellのサブクラスを作成し、http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcell.paint.aspx [Paint]をオーバーライドするか、http:// msdnを処理する必要があります。 DataGridViewのmicrosoft.com/en-us/library/system.windows.forms.datagridview.cellpainting.aspx[CellPainting]イベント。