0

我正在开发的应用程序的一部分使用一些代码根据从 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());
   }
}

然后,在下面,我有相应的事件处理程序:

 void Remove_Click(object sender, EventArgs e)
 { // Here I must perform the operations subject of this question, in order to proceed to removal operation}

void ExtView_Click(object sender, EventArgs e)
{ 
   // Here I need the same code to know with which device properties populate the form below;
   UsbDevicesProperties uDevP = new UsbDevicesProperties();

   uDevP.Show();
}

任何人都可以帮助我。请?正如我搜索了很多,但我似乎没有找到任何可行的解决方案。

希望得到您的帮助。

谢谢。

4

2 回答 2

0

我通常将这个.Tag属性用于这样的事情。您可以将任何值放入该属性。输入一个值,以帮助您识别TextBox(或它背后的数据项)。在您的上下文菜单事件处理程序中,强制sender转换为 a ContextMenuStrip,检查该对象的SourceControl属性,将该属性值强制转换为 aTextBox并读取.Tag属性以确定TextBox它是什么。

如果要ContextMenuStrip为每个文本框创建一个新文本框,则可以选择在 the或其菜单项.Tag上使用该属性。ContextMenuStrip但是,由于看起来每个上下文菜单都有相同的选项,我建议您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 */
}
于 2013-06-03T16:02:37.303 回答
0

实际上,您的建议为我指明了正确的方向。我什至不需要标签属性。

在编辑我的代码以仅使用一个 ContextMenuStrip 后,

作为我的控件 ToolStripMenuItem,无法直接使用您的解决方案,但通过这种方式,我得到了 TextBoxes 中的文本!

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

谢谢!!

于 2013-06-04T07:05:39.113 回答