如何仅使用一个上下文菜单从不同的标签复制文本

How to copy text from different Labels using only one context menu

我有一个 Windows 联系人列表表单程序。我已经有一个用于从 DataGridView 复制和粘贴的上下文菜单。
但是,我希望能够右键单击标签并从上下文菜单中 select 复制以从该标签复制数据。
我有 10 个不同的标签,我不想要所有的,只想要我右键单击的那个 select 复制。

我知道使用 Clipboard.SetText(label1.text) 会让我 select 那个特定的标签,但我不知道如何创建 10 个上下文标签,而我应该可以用一个来创建。

如果我想要 select 所有文本框,我可以这样做。

string UserInfo = $"{lblFirstName.Text}\n" +
                  $"{lblLastName.Text}\n" +
                  $"{lblEmailAddress.Text}\n" +
                  $"{lblPhysicalAddress.Text}\n" +
                  $"{lblCountry.Text}\n" +
                  $"{lblCompany.Text}\n" +
                  $"{lblStatus.Text}\n" +
                  $"{lblFirstContact.Text}\n" +
                  $"{lblLastContact.Text}\n" +
                  $"{lblNotes.Text}\n ";
Clipboard.SetText(UserInfo);

对于 DataGridView 来说很简单。但这是为了使用鼠标右键单击一个标签进行复制。

我创建了第二个 ContextMenuStrip,应该发生什么:

  1. 右键单击 labelA
  2. 上下文菜单弹出复制,select它
  3. 系统识别出 labelA 被右键单击,因此从标签中获取文本。 Clipboard.SetText(labelChosen)
  4. 然后如果用户想要单击 labelC 将被选中。

我只是不想为此创建 10 个上下文菜单。

已编辑 - 感谢 @Jimi 通过评论提出此建议

最简单的解决方案是将 ContextMenuStrip 控件从工具箱添加到您的表单,并配置一个项目 - "Copy";双击该项目,并在事件处理程序中使用以下代码(假设您的上下文菜单条称为 labelContextMenuStrip):

Clipboard.SetText(labelContextMenuStrip.SourceControl.Text);

然后您可以在设计器中将 ContextMenuStrip 分配给每个所需标签的 ContextMenuStrip 属性,或者以编程方式在表单的 LoadShown 事件中:

foreach (var label in Controls.OfType<Label>())
{
    label.ContextMenuStrip = labelContextMenuStrip;
}

完整代码(经过验证的解决方案):

private void Form1_Load(object sender, EventArgs e)
{
    // Optional - can be manually set in the Designer
    foreach (var label in Controls.OfType<Label>())
    {
        label.ContextMenuStrip = labelContextMenuStrip;
    }
}

private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
    Clipboard.SetText(labelContextMenuStrip.SourceControl.Text);
}