如何仅使用一个关联菜单从不同标签复制文本



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

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

如果我想选择所有的文本框,我可以这样做。

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. 弹出上下文菜单并选择副本
  3. 系统识别出labelA是右键单击的,因此从标签中获取文本。Clipboard.SetText(labelChosen)
  4. 则如果用户想要点击将被选择的CCD_ 5

我只是不想创建10个上下文菜单来做这件事。

编辑-感谢@Jimi的建议,通过评论

最简单的解决方案是从工具箱中将ContextMenuStrip控件添加到Form中,并配置一个项"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);
}

最新更新