将NetworkInterface适配器从组合框传递给方法



嗨,我怎么能传递作为网络接口适配器从我的组合框的方法?GetDeviceInfo

私有字符串GetDeviceInfo(NetworkInterface适配器)?

我将网络设备填充到我的组合框:

foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
cbox1.Items.Add(nic.Name);
}

我有下面的方法&如何传递选定的组合框项?

我知道如何选择项目的例子:cbox1.Items[cbox1.SelectedIndex].ToString(),但我不能理解如何通过作为网络适配器?

private void cbox1_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
//
}
private string GetDeviceInfo(NetworkInterface adapter)
{
if (adapter == null)
{
return String.Empty;
}
IPInterfaceProperties properties = adapter.GetIPProperties();
StringBuilder infoBuilder = new StringBuilder();
infoBuilder.Append(adapter.Description + "n");
infoBuilder.Append("=================================================n");
infoBuilder.AppendFormat(" ID ......................... : {0}n",
adapter.Id);
infoBuilder.AppendFormat(" Name ....................... : {0}n",
adapter.Name);
infoBuilder.AppendFormat(" Interface type ............. : {0}n",
adapter.NetworkInterfaceType);
infoBuilder.AppendFormat(" Physical Address ........... : {0}n",
BitConverter.ToString(adapter.GetPhysicalAddress().GetAddressBytes()));
infoBuilder.AppendFormat(" Operational status ......... : {0}n",
adapter.OperationalStatus);
infoBuilder.AppendFormat(" Speed ...................... : {0} Mb/sn",
adapter.Speed / 1000000);
string versions = String.Empty;
// Create a display string for the supported IP versions.
if (adapter.Supports(NetworkInterfaceComponent.IPv4))
{
versions = "IPv4";
}
if (adapter.Supports(NetworkInterfaceComponent.IPv6))
{
if (versions.Length > 0)
{
versions += " ";
}
versions += "IPv6";
}
infoBuilder.AppendFormat(" IP version ................. : {0}n",
versions);
infoBuilder.Append(GetIPAddresses(properties));
// The following information is not useful for loopback adapters.
if (adapter.NetworkInterfaceType == NetworkInterfaceType.Loopback)
{
return infoBuilder.ToString();
}
infoBuilder.AppendFormat(" DNS suffix ................. : {0}n",
properties.DnsSuffix);
if (adapter.Supports(NetworkInterfaceComponent.IPv4))
{
IPv4InterfaceProperties ipv4 = properties.GetIPv4Properties();
infoBuilder.AppendFormat(" Index ...................... : {0}n",
ipv4.Index);
infoBuilder.AppendFormat(" MTU ........................ : {0}n",
ipv4.Mtu);
infoBuilder.AppendFormat(" APIPA active ............... : {0}n",
ipv4.IsAutomaticPrivateAddressingActive);
infoBuilder.AppendFormat(" APIPA enabled .............. : {0}n",
ipv4.IsAutomaticPrivateAddressingEnabled);
infoBuilder.AppendFormat(" DHCP enabled ............... : {0}n",
ipv4.IsDhcpEnabled);
infoBuilder.AppendFormat(" Forwarding enabled.......... : {0}n",
ipv4.IsForwardingEnabled);
infoBuilder.AppendFormat(" Uses WINS .................. : {0}n",
ipv4.UsesWins);
if (ipv4.UsesWins)
{
IPAddressCollection winsServers = properties.WinsServersAddresses;
if (winsServers.Count > 0)
{
foreach (IPAddress winsServer in winsServers)
{
infoBuilder.AppendFormat(" WINS Server ................ : {0}n",
winsServer);
}
}
}
}
if (adapter.Supports(NetworkInterfaceComponent.IPv6))
{
IPv6InterfaceProperties ipv6 = properties.GetIPv6Properties();
infoBuilder.AppendFormat(" Index ...................... : {0}n",
ipv6.Index);
infoBuilder.AppendFormat(" MTU ........................ : {0}n",
ipv6.Mtu);
}
infoBuilder.AppendFormat(" DNS enabled ................ : {0}n",
properties.IsDnsEnabled);
infoBuilder.AppendFormat(" Dynamically configured DNS . : {0}n",
properties.IsDynamicDnsEnabled);
infoBuilder.AppendFormat(" Receive Only ............... : {0}n",
adapter.IsReceiveOnly);
infoBuilder.AppendFormat(" Multicast .................. : {0}n",
adapter.SupportsMulticast);
return infoBuilder.ToString();
}

您应该直接添加NetworkInterface对象,而不是将网络接口名称添加到组合框项中。

cbox1.Items.Add(nic);

然后你可以在你的组合框中设置项目模板来修复显示:

<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>

你可以在事件回调中访问你选择的网络接口:

private void cbox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(e.AddedItems is not null && e.AddedItems.Count > 0 && e.AddedItems[0] is NetworkInterface ni)
{
// do something with "ni"
}
}

编辑:如果你真的想只添加接口名称到组合框,那么你可以实现这样的事件回调:

private void Cbox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if(e.AddedItems is not null && e.AddedItems.Count > 0 && e.AddedItems[0] is string niName)
{
var ni = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(x => x.Name == niName);
// "ni" can be null!
}
}

但是您可能会遇到一些问题,例如,如果两个接口具有相同的名称或该接口不再被发现。要解决第二个问题,您可以将接口列表存储在变量中,而不是在每次选择新项时调用GetAllNetworkInterfaces()

最新更新