4

ユーザーが特定のセルのコンテキスト メニューからコピーを選択したときに、データグリッド セルの内容をクリップボードにコピーするにはどうすればよいでしょうか?

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

4 に答える 4

2

私がすることはこれだと思います:

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);
于 2013-11-03T11:53:39.503 に答える
0

次のように MouseClick-Method を変更できます。

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());
}
于 2013-11-03T12:01:12.493 に答える
0

Click イベント ハンドラーをメニュー項目に追加してみませんか? その場合、そのイベントで行う必要があるのは次のことだけです。

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

クリップボードにあるものを上書きする前に、セルに実際に値があることを確認するための簡単な編集を追加しました。

于 2013-11-04T20:19:34.763 に答える
-1

Clipboardクラスを使用できます。この特定のケースでは、 SetTextメソッドが必要です。
注: msdn によると、クリップボードは System.Windows にありますが、私のマシンでは System.Windows.Forms にあります。

于 2013-11-03T11:51:20.477 に答える