右键单击复制不适用于C#应用程序

时间:2013-12-08 17:05:14

标签: c#

我在我的数据网格上创建了​​一个右键单击复制选项,但它似乎没有复制单元格中的内容。有什么理由为什么会这样?我注意到当用户已经在剪贴板中有东西时会发生这种情况。

    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());
    }

1 个答案:

答案 0 :(得分:2)

也许这对你的情况不起作用,但这就是我要做的事情(这看起来像WinForms)。

  • 在表单中添加ContextMenuStrip

  • 将“复制”菜单项添加到上下文菜单中,并订阅该项目的点击事件。

  • 将以下代码放在click事件中(如果.Value为null,则Convert.ToString()返回空字符串,而.ToString()将抛出异常):

    Clipboard.SetText(Convert.ToString(dataGridView1.CurrentCell.Value));

  • 通过网格DataGridView属性将其附加到ContextMenuStrip

要仅对单元格执行此操作,请执行命中测试以确定单击网格的哪个部分,然后使用结果允许或取消打开上下文菜单。

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;
}