我有一个带有DataGridView控件的WINFORM应用程序,它挂接到ContextMenuStrip控制器中
ContextMenuStrip触发事件,实质上在DataGridView和剪贴板之间执行复制/粘贴。
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
CopyClipboard();
}
private void CopyClipboard()
{
DataObject d = myGrid.GetClipboardContent();
Clipboard.SetDataObject(d);
}
private void pasteCtrlVToolStripMenuItem_Click(object sender, EventArgs e)
{
PasteClipboard();
}
我已经将另一个DataGridView添加到我的应用程序中,并希望在它们之间共享ContextMenuStrip,因为根据我上面的代码,它被硬编码到我的网格myGrid中。
我相信修改我的代码以从sender:投射一个新的DataGridView控件将是一个简单的练习
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
CopyClipboard(sender);
}
private void CopyClipboard(object sender)
{
var grid = (DataGridView)sender;
DataObject d = grid.GetClipboardContent();
Clipboard.SetDataObject(d);
}
private void pasteCtrlVToolStripMenuItem_Click(object sender, EventArgs e)
{
var grid = (DataGridView)sender;
PasteClipboard(grid);
}
但当然,我发现发送方是ToolStripMenuItem。
是否有方法通过发送方或EventArgs e引用原始DataViewGrid?
并且,感谢您阅读:)
啊,我想我明白了!
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
CopyClipboard(sender);
}
private void CopyClipboard(object sender)
{
var grid = (DataGridView)sender;
DataObject d = grid.GetClipboardContent();
Clipboard.SetDataObject(d);
}
private void pasteCtrlVToolStripMenuItem_Click(object sender, EventArgs e)
{
var item = (ToolStripMenuItem)sender;
ToolStripMenuItem t = (ToolStripMenuItem)sender;
ContextMenuStrip s = (ContextMenuStrip)t.Owner;
var grid = (DataGridView)s.SourceControl;
// Pulling the backend datatable just to enhance the example.
// Going Live, the consumer of the "grid" will do the extraction.
BindingSource bs = (BindingSource)grid.DataSource;
DataTable dt = (DataTable)bs.DataSource;
PasteClipboard(grid, dt);
}
我在这里找到了解决方案:http://discuss.joelonsoftware.com/default.asp?dotnet.12.474610.5
最后,对于这个线程,我想添加ToolStripMenuItem作为线程标记,但我没有rep。感谢销售代表将其添加到标签缓存中,以便我可以更新此步骤;希望能让其他人的生活,同样的问题,更容易找到这个线索!:)
尝试
var grid = CType(sender, DataGridView)
或
var grid = CType(sender.parent, DataGridView)