1

我有一个 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 控件来编辑值,所以不应该有某种方法可以到达该句柄吗?

我正在使用 .NET 2.0 和 C#

4

1 回答 1

2

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

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

于 2010-07-04T14:14:44.033 回答