我有一个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#
答案 0 :(得分:2)
如果要为当前正在编辑的单元格引用TextBox,可以在DataGridView本身上使用DataGridView.EditingControl属性。将代码放在EditingControlShowing事件的处理程序中,以便在显示新的TextBox时调用它。
当然,您实际上想要在未编辑的单元格上设置水印,因为正在编辑的单元格具有键盘焦点,因此无论如何都会隐藏水印。未编辑的单元格没有窗口句柄,并且完全用托管代码绘制,因此您无法使用SendMessage执行此操作。您需要创建DataGridViewCell的子类并覆盖Paint或处理DataGridView上的CellPainting事件。