我有一个用于联系人列表的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,应该发生什么:
labelA
labelA
被右键单击,因此从“标签”中获取文本。
Clipboard.SetText(labelChosen)
labelC
。我只是不想创建10个上下文菜单来做到这一点。
答案 0 :(得分:2)
编辑-感谢 @Jimi 的建议,通过评论
最简单的解决方案是从工具箱中将ContextMenuStrip
控件添加到表单中,并配置一个项目“复制”;双击该项目,然后在事件处理程序中使用以下代码(假定您的上下文菜单条称为labelContextMenuStrip):
Clipboard.SetText(labelContextMenuStrip.SourceControl.Text);
然后,您可以在设计器中,或者以编程方式,在窗体的ContextMenuStrip
或Load
事件中,将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);
}