C# 如何在用户选择“时将数据复制到剪贴板”;“复制”;从上下文菜单
当用户从特定单元格的关联菜单中选择“复制”时,如何将datagrid单元格的内容复制到剪贴板C# 如何在用户选择“时将数据复制到剪贴板”;“复制”;从上下文菜单,c#,.net,winforms,C#,.net,Winforms,当用户从特定单元格的关联菜单中选择“复制”时,如何将datagrid单元格的内容复制到剪贴板 public Form1() { InitializeComponent(); dataGridView1.MouseClick += dataGridView1_MouseClick; } void dataGridView1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.
public Form1()
{
InitializeComponent();
dataGridView1.MouseClick += dataGridView1_MouseClick;
}
void dataGridView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ContextMenu m = new ContextMenu();
m.MenuItems.Add(new MenuItem("Copy"));
int currentMouseOuverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex;
m.Show(dataGridView1, new Point(e.X, e.Y));
}
}
您可以使用该类,在这种特殊情况下,您需要该方法。注意:msdn说剪贴板在System.Windows中,但在我的计算机上它在System.Windows.Forms中。我想我应该做的是:
var hitTestInfo = dataGridView1.HitTest(e.X, e.Y);
if (hitTestInfo.Type != DataGridViewHitTestType.Cell) { return; }
var mi = new MenuItem("Copy")
mi.Tag = hitTestInfo;
mi.Click += (s, e) =>
{
var hti = ((MenuItem)s).Tag as HitTestInfo;
var val = dataGridView1.Rows[hti.RowIndex].Cells[hti.ColumnIndex].Value;
Clipboard.SetData(DataFormats.Text, val);
}
m.MenuItems.Add(mi);
您可以如下更改鼠标单击方法:
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)
{
}
}
}
}
然后创建一个方法,该方法在引发mItem.Click-Event时调用:
void mItem_Click(object sender, EventArgs e)
{
Clipboard.SetText(dataGridView1.CurrentCell.Value.ToString());
}
为什么不在菜单项中添加单击事件处理程序?那么在这种情况下,您需要做的就是:
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count < 1)
return;
var cell = dataGridView1.Rows[dataGridView1.SelectedRows[0].Index].Cells["CellName"].Value;
if (cell != null)
Clipboard.SetText(cell.ToString());
}
private void copyToolStripMenuItem\u单击(对象发送方,事件参数e)
{
如果(dataGridView1.SelectedRows.Count<1)
返回;
var cell=dataGridView1.Rows[dataGridView1.SelectedRows[0].Index].Cells[“CellName”].Value;
如果(单元格!=null)
Clipboard.SetText(cell.ToString());
}
只是添加了一个快速编辑,以确保在你去覆盖剪贴板上的任何内容之前,单元格中确实有一个值。我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。你的帖子说你正在使用上下文菜单。难道你不能为ContextMenuItem设置一个单击事件,从中获取所选行,然后将其添加到剪贴板吗?@Antoine LaurentLavoisier,正好代替你现在的代码。我刚刚修改了您提供的代码。在
void dataGridView1\u MouseClick(object sender,MouseEventArgs e)
或public Form1()
@Antoine LaurentLavoisier中,我从MouseClick
事件处理程序中直接提取了HitTest
代码。只需合并我的代码。当然,您仍然需要代码来创建上下文菜单并显示它。此外,在创建菜单之前检查hitTestInfo.Type==DataGridViewHitTestType.Cell
。DataFormats.UnicodeText
如果您正在剪贴板中查找UTF-8,这将是正确的。。。否则它将使用默认的Windows编码。