【问题标题】:ToolStripMenuItem_Click(object sender, EventArgs e) - casting back to a DataGridViewToolStripMenuItem_Click(object sender, EventArgs e) - 转换回 DataGridView
【发布时间】:2012-07-19 18:11:59
【问题描述】:

我有一个带有 DataGridView 控件的 WINFORM 应用程序,该应用程序与 ContextMenuStrip 控件挂钩。
ContextMenuStrip 触发事件以在 DataGridViewClipboard 之间执行复制/粘贴。

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

当然,我发现 senderToolStripMenuItem

有没有办法通过 senderEventArgs e 引用原始的 DataViewGrid

还有,感谢您的阅读:)

【问题讨论】:

    标签: c# datagridview casting contextmenustrip sender


    【解决方案1】:

    啊,我想我明白了!

    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 作为线程 tag 但我没有代表。 感谢代表将其添加到 tag 缓存中的人,以便我可以更新此踏板; 希望让别人的生活,同样的问题,更容易找到这个线程! :)

    【讨论】:

      【解决方案2】:

      试试

      var grid = CType(sender, DataGridView)
      

      var grid = CType(sender.parent, DataGridView)
      

      【讨论】:

      • PaShKa,感谢您的回复,但 CType(sender, DataGridView) 是 c# (DataGridView)sender 的 vb 版本,并且 sender 没有名为 parent 的属性 :(
      • 您可以将 Sender 转换为 ToolStripMenuItem 吗?我认为它有 .parent 可用
      • 您不能将 ToolStripMenuItem 转换为 DataGridView。在这种情况下,发送者是 ToolStripMenuItem。
      • 这可能是解决方案...试图将其发布为答案,但是菜鸟太多了。无论如何,不​​确定这是否完全是我正在寻找的,但这是一个开始:discuss.joelonsoftware.com/default.asp?dotnet.12.474610.5
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      相关资源
      最近更新 更多