C# 如何将对象添加到列表框并使用特定文本显示它们
本文关键字:文本 显示 对象 添加 列表 | 更新日期: 2023-09-27 18:32:29
我曾经在delphi中这样做,即将对象和项目同时添加到列表框中:
function TMainForm.JvHidDeviceController1Enumerate(HidDev: TJvHidDevice;
const Idx: Integer): Boolean;
var
N: Integer;
Dev: TJvHidDevice;
begin
VID := JvValidateEdit1.Value;
PID := JvValidateEdit2.Value;
// MessageDlg(IntToStr(DeviceRadioGroup.ItemIndex), mtInformation, mbOKCancel, 0);
If (HidDev.Attributes.VendorID = VID) And
(HidDev.Attributes.ProductID = PID) Then
begin
N := ListBox1.Items.Add('dsn: ' + HidDev.SerialNumber);
JvHidDeviceController1.CheckOutByIndex(Dev, Idx);
ListBox1.Items.Objects[N] := Dev;
DeviceMemo.Lines.Append(HidDev.SerialNumber +
' : connected(enumerated) - ' + (TimeToStr(Now)));
InfoBtn.Enabled := true;
WriteBtn.Enabled := true;
end;
Result := true;
end;
我正在起诉 Mike 的 HIDLibrary,我有多个设备,每个设备都有不同的序列号,我需要添加到列表框中,问题是我不知道是否可以将对象添加到列表框中并在 C# 中以不同的文本显示它们,就像我以前在 delphi 中所做的那样, 当我将HidDevice对象添加到列表框时,默认文本显示设备的路径,而我只想显示序列号。我提取序列号。每个有效的 HID 设备,并在一行中使用它使用添加该序列号产生的索引将其插入 AllValidHIDDevices。到列表框,以便每个 HID 设备都绑定到其序列号。当我单击序列号时,我实际上是在检索带有该序列号软件快照的 HID 设备
HidDevice CurrentHIDDevice;
List<HidDevice> AllValidHIDDevices = new List<HidDevice>();
IEnumerable<HidDevice> USBDevices;
private void timer1_Tick(object sender, EventArgs e)
{
AllValidHIDDevices.Clear();
listBox1.Items.Clear();
USBDevices = HidDevices.Enumerate(0x0483);
foreach (HidDevice validHIDDevice in USBDevices.Where(x => x.Attributes.ProductHexId == "0xAB12"))
{
byte[] serialNo;
validHIDDevice.Inserted += deviceInserted;
validHIDDevice.Removed += deviceRemoved;
validHIDDevice.MonitorDeviceEvents = true;
if (validHIDDevice.IsConnected)
{
timer1.Stop();
button1.Enabled = true;
validHIDDevice.ReadSerialNumber(out serialNo);
AllValidHIDDevices.Insert(listBox1.Items.Add("Serial Number: " + Encoding.Unicode.GetString(serialNo)), validHIDDevice);
}
}
if (listBox1.Items.Count > 0)
{
listBox1.SelectedIndex = 0;
CurrentHIDDevice = AllValidHIDDevices[listBox1.SelectedIndex];
}
}
private void deviceInserted()
{
this.InvokeEx(x => x.toolStripStatusLabel1.Text = listBox1.Items.Count.ToString() + " device(s) attached");
}
private void deviceRemoved()
{
foreach (HidDevice validHIDDevice in AllValidHIDDevices)
{
if (validHIDDevice.IsOpen)
validHIDDevice.CloseDevice();
validHIDDevice.Dispose();
}
this.InvokeEx(x => x.toolStripStatusLabel1.Text = "No device(s) attached");
this.InvokeEx(x => x.listBox1.Items.Clear());
this.InvokeEx(x => x.button1.Enabled = false);
this.InvokeEx(x => x.timer1.Start());
}
添加项目后,我只需单击它即可选择它并与之交互:
private void listBox1_Click(object sender, EventArgs e)
{
try
{
if (listBox1.Items.Count > 0 && listBox1.SelectedIndex >= 0)
CurrentHIDDevice = AllValidHIDDevices[listBox1.SelectedIndex];
}
catch
{
MessageBox.Show("Selected item is not a USB device!");
}
}
好的,我现在回答这个问题。
我正在使用 dll,因为我使用 NuGet 下载了它,现在我明白为什么我无法修改与 HidDevice 类相关的任何内容,我认为 NuGet 也下载了这个库的源代码并使用它,但在包文件夹中,只有 dll。然后我删除了它,并从 GitHub 下载了库本身的源代码,学习如何添加和使用它。我刚刚修改了HidDevice类中的ToString函数,如下所示:
public override string ToString()
{
byte[] SerialNumber;
ReadSerialNumber(out SerialNumber);
string SerialNumberString = "Serial Number = " + Encoding.Unicode.GetString(SerialNumber);
if (SerialNumberString[0] == ''0')
{
return string.Format("VendorID={0}, ProductID={1}, Version={2}, DevicePath={3}",
_deviceAttributes.VendorHexId,
_deviceAttributes.ProductHexId,
_deviceAttributes.Version,
_devicePath);
}
else
{
return SerialNumberString;
}
}
解决方案现在简单得多。感谢@TaW首先指出这一点。