C# ToolStripMenuItem\u单击(对象发送者,事件参数)-强制转换回DataGridView

C# ToolStripMenuItem\u单击(对象发送者,事件参数)-强制转换回DataGridView,c#,datagridview,casting,contextmenustrip,sender,C#,Datagridview,Casting,Contextmenustrip,Sender,我有一个WINFORM应用程序,带有DataGridView控件,连接到ContextMenuStrip控件中。 ContextMenuStrip触发事件,基本上在DataGridView和剪贴板之间执行复制/粘贴 private void copyToolStripMenuItem_Click(object sender, EventArgs e) { CopyClipboard(); } private void CopyClipboard() { DataObject d = m

我有一个WINFORM应用程序,带有DataGridView控件,连接到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

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控件将是一个简单的练习:

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

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();
}
是否有办法通过发送方或事件参数引用原始的数据视图网格

还有,谢谢你的阅读:)

试试看

var grid = CType(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 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);
}
我在这里找到了解决方案:

最后,根据这个线程,我想添加ToolStripMenuItem作为线程标记,但我没有代表。 感谢销售代表将其添加到标记缓存中,以便我可以更新此踏板;
希望用同样的问题让别人的生活更容易找到这条线索

PaShKa,感谢您的回复,但CType(sender,DataGridView)是c#(DataGridView)sender的vb版本,sender没有名为parent的属性:(您能将发件人转换为ToolStripMenuItem吗?我想它有。父级可用。您不能将ToolStripMenuItem转换为DataGridView。在这种情况下,发件人是ToolStripMenuItem。这可能是解决方案…试图将其作为答案发布,但由于太多的noob无法完成。无论如何,不确定这是否完全是我想要的,但它是一个明星。)t: