Clipboard.GetImage() 返回 null
Clipboard.GetImage() returning null
我有一个 DataGridView
,其中包含一个 Image
列和一些文本列。我有一个非常简单的处理程序,允许用户从单元格中复制文本或图像并将图像和文本粘贴到其中。 Copy/Paste 适用于文本,但粘贴不适用于图像。 (注意:如果我粘贴从另一个应用程序(如画图)放置在剪贴板上的图像,则它可以正常工作)
如果我在 Clipboard.SetImage()
之后立即调用 Clipboard.GetImage()
它工作正常,这让我相信它可能是范围问题或者 Clipboard
正在获取引用并且不是图像的底层字节。我必须将原始图像字节放在共享位置吗?我检查了 MSDN definition for GetImage 以确保我做的是正确的。
private void dataGridView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
if (Clipboard.ContainsImage())
{
Image img = Clipboard.GetImage(); // always returns null
if (cell.ColumnIndex == _imageCol)
cell.Value = img;
}
if (Clipboard.ContainsText())
{
if (cell.ColumnIndex != _imageCol)
cell.Value = Clipboard.GetText(); // always works
}
}
if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control)
{
DataGridViewCell cell = dataGridView1.SelectedCells[0];
if (cell.ColumnIndex == _imageCol)
{
Clipboard.SetImage((Image)cell.Value);
Image img2 = Clipboard.GetImage(); // successfully returns the Image
}
else
Clipboard.SetText((string)cell.Value);
}
}
您没有指望的是 DataGridView 也 实现了 copy/paste。使用与您使用的相同的快捷键,Ctrl+C 和 Ctrl+V。所以看起来它在您将图像放在剪贴板上后就可以工作,但 DGV 也会这样做并覆盖剪贴板内容。不幸的是,它不复制图像,只复制文本。图像列的空字符串。
你必须告诉它你处理了击键:
private void dataGridView1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) {
// etc...
e.Handled = true;
}
if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control) {
// etc...
e.Handled = true;
}
}
我有一个 DataGridView
,其中包含一个 Image
列和一些文本列。我有一个非常简单的处理程序,允许用户从单元格中复制文本或图像并将图像和文本粘贴到其中。 Copy/Paste 适用于文本,但粘贴不适用于图像。 (注意:如果我粘贴从另一个应用程序(如画图)放置在剪贴板上的图像,则它可以正常工作)
如果我在 Clipboard.SetImage()
之后立即调用 Clipboard.GetImage()
它工作正常,这让我相信它可能是范围问题或者 Clipboard
正在获取引用并且不是图像的底层字节。我必须将原始图像字节放在共享位置吗?我检查了 MSDN definition for GetImage 以确保我做的是正确的。
private void dataGridView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
if (Clipboard.ContainsImage())
{
Image img = Clipboard.GetImage(); // always returns null
if (cell.ColumnIndex == _imageCol)
cell.Value = img;
}
if (Clipboard.ContainsText())
{
if (cell.ColumnIndex != _imageCol)
cell.Value = Clipboard.GetText(); // always works
}
}
if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control)
{
DataGridViewCell cell = dataGridView1.SelectedCells[0];
if (cell.ColumnIndex == _imageCol)
{
Clipboard.SetImage((Image)cell.Value);
Image img2 = Clipboard.GetImage(); // successfully returns the Image
}
else
Clipboard.SetText((string)cell.Value);
}
}
您没有指望的是 DataGridView 也 实现了 copy/paste。使用与您使用的相同的快捷键,Ctrl+C 和 Ctrl+V。所以看起来它在您将图像放在剪贴板上后就可以工作,但 DGV 也会这样做并覆盖剪贴板内容。不幸的是,它不复制图像,只复制文本。图像列的空字符串。
你必须告诉它你处理了击键:
private void dataGridView1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) {
// etc...
e.Handled = true;
}
if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control) {
// etc...
e.Handled = true;
}
}