我在数据网格上创建了一个右键复制选项,但它似乎没有复制单元格中的内容。为什么会这样?我注意到,当用户已经在剪贴板中有东西时,就会发生这种情况。
private void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
using (ContextMenu m = new ContextMenu())
{
MenuItem mItem = new MenuItem("Copy");
m.MenuItems.Add(mItem);
DataGridView.HitTestInfo information = dataGridView1.HitTest(e.X, e.Y);
try
{
dataGridView1.CurrentCell = dataGridView1.Rows[information.RowIndex].Cells[information.ColumnIndex];
m.Show(dataGridView1, new Point(e.X, e.Y));
mItem.Click += mItem_Click;
}
catch (Exception)
{
}
}
}
}
void mItem_Click(object sender, EventArgs e)
{
Clipboard.SetText(dataGridView1.CurrentCell.Value.ToString());
}
也许这在您的情况下不起作用,但我会这样做(看起来像WinForms)。
-
在表单中添加
ContextMenuStrip
。 -
将"复制"菜单项添加到上下文菜单中,并订阅该项的单击事件。
-
将以下代码放入点击事件中(如果
.Value
为null,Convert.ToString()将返回一个空字符串,而.ToString()将抛出一个异常):Clipboard.SetText(Convert.ToString(dataGridView1.CurrentCell.Value));
-
通过网格的
ContextMenuStrip
属性将其附加到DataGridView
。
要使此功能仅适用于单元格,请执行命中测试,以确定正在单击网格的哪个部分,然后使用结果来允许或取消打开上下文菜单。
private bool isCellClicked = false;
private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
var hit = dataGridView1.HitTest(e.X, e.Y);
isCellClicked = (hit.Type == DataGridViewHitTestType.Cell);
}
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
e.Cancel = !isCellClicked;
}