从DataGridViewTextBoxCell获取句柄IntPtr?

时间:2010-07-04 04:23:24

标签: c# datagridview controls winforms-interop

我有一个DataGridView,其中包含一列需要水印文本的文本框单元格。我还有一个静态类,它使用DLLImport使用SendMessage将一个水印添加到TextBox,并使用IntPtr hWnd作为参数之一,如下所示:

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

问题是,虽然TextBox继承了Control.Handle属性,但DataGridViewTextBoxCell却没有,所以我无法获取该IntPtr参数。我的理解是单元格使用TextBox控件来编辑值,所以不应该有某种方法来获取Handle?

我正在使用.NET 2.0和C#

1 个答案:

答案 0 :(得分:2)

如果要为当前正在编辑的单元格引用TextBox,可以在DataGridView本身上使用DataGridView.EditingControl属性。将代码放在EditingControlShowing事件的处理程序中,以便在显示新的TextBox时调用它。

当然,您实际上想要在未编辑的单元格上设置水印,因为正在编辑的单元格具有键盘焦点,因此无论如何都会隐藏水印。未编辑的单元格没有窗口句柄,并且完全用托管代码绘制,因此您无法使用SendMessage执行此操作。您需要创建DataGridViewCell的子类并覆盖Paint或处理DataGridView上的CellPainting事件。