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

时间:2019-02-10 22:27:06

标签: c# winforms label contextmenu

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

我知道使用Clipboard.SetText(label1.text)可以让我选择该特定的Label,但是我不打算创建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. 然后,如果用户要单击将被选择的labelC

我只是不想创建10个上下文菜单来做到这一点。

1 个答案:

答案 0 :(得分:2)

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

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

Clipboard.SetText(labelContextMenuStrip.SourceControl.Text);

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

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