C# 如何在用户选择“时将数据复制到剪贴板”;“复制”;从上下文菜单

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.

当用户从特定单元格的关联菜单中选择“复制”时,如何将datagrid单元格的内容复制到剪贴板

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编码。