C# 从通过C中的ContextMenu访问的动态创建的文本框中检索值#
我正在开发的应用程序的一部分使用一些代码根据从wmi搜索程序中找到的可移动设备的数量动态创建文本框 由于我想显示有关这些设备的更多信息,并让用户能够从程序中删除设备,因此我改进了文本框,为每个文本框创建了一个带有一些扩展选项的小上下文菜单 每个选项都是使用事件处理程序创建的,因此当用户单击一个选项时,将执行相关操作 现在,举例来说,要使用“删除”选项,我需要知道用户选择了哪个文本框,并获取其文本,以便执行一些操作 我怎样才能做到这一点?如何知道用户选择了哪个文本框并获取其文本 这就是我到目前为止所做的:C# 从通过C中的ContextMenu访问的动态创建的文本框中检索值#,c#,textbox,contextmenu,C#,Textbox,Contextmenu,我正在开发的应用程序的一部分使用一些代码根据从wmi搜索程序中找到的可移动设备的数量动态创建文本框 由于我想显示有关这些设备的更多信息,并让用户能够从程序中删除设备,因此我改进了文本框,为每个文本框创建了一个带有一些扩展选项的小上下文菜单 每个选项都是使用事件处理程序创建的,因此当用户单击一个选项时,将执行相关操作 现在,举例来说,要使用“删除”选项,我需要知道用户选择了哪个文本框,并获取其文本,以便执行一些操作 我怎样才能做到这一点?如何知道用户选择了哪个文本框并获取其文本 这就是我到目前为止
foreach (UsbDisk disk in disks)
{
++count;
TextBox[] usbTextBox = new TextBox[count];
for (int i = 0; i < 1; i++)
{
var txt = new TextBox();
var contextMenuUsbDev = new ContextMenuStrip();
var ExtView = contextMenuUsbDev.Items.Add("View Extended Properties");
var Remove = contextMenuUsbDev.Items.Add("Remove");
ExtView.Click += ExtView_Click;
Remove.Click += Remove_Click;
contextMenuUsbDev.RenderMode = ToolStripRenderMode.System;
contextMenuUsbDev.Size = new Size(211, 48);
contextMenuUsbDev.Location = new Point(390, 240 + (i * 45));
contextMenuUsbDev.Cursor = Cursors.Hand;
txt.Location = new Point(390, 240 + (i * 45));
txt.BackColor = Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
txt.ForeColor = Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));
txt.Size = new Size(230,45);
txt.TabIndex = i;
txt.BorderStyle = BorderStyle.None;
txt.ReadOnly = true;
txt.Multiline = true;
txt.WordWrap = true;
txt.Font = new Font("Courier New", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
txt.ContextMenuStrip = contextMenuUsbDev;
usbDevPanel.Controls.Add(txt);
txt.AppendText(CR + count + ") " + disk.ToString());
}
}
任何能帮助我的人。请我搜索了很多,但似乎没有找到任何可行的解决方案
希望你的帮助
谢谢。我通常使用
.Tag
属性来处理类似的事情。您可以在该属性中输入任何值。输入有助于识别文本框
(或其后面的数据项)的值。在上下文菜单事件处理程序中,将sender
强制转换为ContextMenuStrip
,检查该对象的SourceControl
属性,将该属性值强制转换为TextBox
并读取.Tag
属性以确定它是哪个TextBox
如果要为每个文本框创建新的ContextMenuStrip
,也可以在ContextMenuStrip
或其菜单项上使用.Tag
属性。但是,由于每个上下文菜单的选项似乎相同,我建议您对所有文本框重复使用一个ContextMenuStrip
void Remove_Click(object sender, EventArgs e)
{
var contextMenu = (ContextMenuStrip) sender;
var textBox = (TextBox) contextMenu.SourceControl;
var tag = textBox.Tag;
/* use tag value to determine which textbox */
}
事实上,你的建议为我指明了正确的方向。 我甚至不需要Tag属性 在编辑代码以仅使用一个ContextMenuStrip之后 作为我的控件,ToolStripMenuItem无法直接使用您的解决方案,但通过这种方式,我在文本框中获得了文本
void Remove_Click(object sender, EventArgs e)
{
var menuItem = (ToolStripMenuItem)sender;
var owner = (ContextMenuStrip)menuItem.Owner;
var text = (TextBox)owner.SourceControl;
string diskValue = text.Text;
}
谢谢
void Remove_Click(object sender, EventArgs e)
{
var menuItem = (ToolStripMenuItem)sender;
var owner = (ContextMenuStrip)menuItem.Owner;
var text = (TextBox)owner.SourceControl;
string diskValue = text.Text;
}