来自结构数组的 C# ComboBox

C# ComboBox from Array of Structs

我有一个看起来像这样的结构:

public struct Server
{
    public String ServerName, ServerUrl, ServerEnvironment;
};

然后我创建一个结构列表:

List<Server> MyServers = new List<Server>();

...并从一个小 XML 文件中读取大约八条记录。这运行良好,如果我在调试器中将鼠标悬停在 "MyServers" 上,它看起来像这样:

MyServers Count=8
  [0] {MyApp.Server}
    ServerEnvironment   "DEV"
    ServerName          "My Dev Server #1"
    ServerUrl           "https://mydev1.mycompany.com/"
  [1] {MyApp.Server}
etc...

然后,如果我执行类似 MessageBox.Show(MyServers[0].ServerName); 的操作,它会显示预期值。

现在我想做的是从 ServerName 字段创建一个 ComboBox。当用户选择一个时,我想我会使用 ComboBox 的 SelectedIndex 属性 来访问所选 ServerName 的其他信息(ServerUrl 和 ServerEnvironment)。

我以为我可以做这样的事情:

comboBoxServers.DataSource = MyServers ... something ... ServerName;

但我似乎找不到任何有用的东西。这是否可能,或者我是否需要创建一个单独的、仅包含 ServerName 字符串的简单列表并将其用于 ComboBox 数据源?

这可能对你有用

comboBoxServers.ValueMember = ServerUrl; 
comboBoxServers.DisplayMember = ServerName;
comboBoxServers.DataSource = MyServers;

DisplayMember:获取或设置 属性 以显示任何 ListControl。指定对象名称的字符串 属性 包含在数据源 属性.

指定的集合中

ValueMember:获取或设置 属性 的路径以用作 ListControl 中项目的实际值。此字符串表示 DataSource 属性 值的单个 属性 名称,或解析为最终数据绑定的 属性 名称的以句点分隔的 属性 名称的层次结构对象。

现在,当用户在 comboBoxServers 中选择一个时,您可以访问所选 ServerName 的其他信息(ServerUrl 和 ServerEnvironment),例如

string urlenv = comboBoxServers.SelectedValue;
string serName = comboBoxServers.Text;

创建列表服务器:

List<Server> Servers= new List<Server>()
{
    new Server  {ServerEnvironment = "DEV", ServerName = "My Dev Server #1"},
    new Server  {ServerEnvironment = "DEV1", ServerName = "My Dev Server #2"},
};

然后将列表添加到组合框:

comboBoxServers.DataSource = Servers;
comboBoxServers.ValueMember = "ServerEnvironment "; 
comboBoxServers.DisplayMember = "ServerName" ;

您只能使用 DisplayMember 在组合框中将名称显示为文本。
然后 comboBox.SelectedValue 将 return 整个对象。

但要使用 DisplayMember,您需要将字段 ServerName 更改为 属性

public struct Server
{
    public string ServerName { get; set; }
}

comboBoxServers.DisplayMember = "ServerName";
comboBoxServers.DataSource = MyServers;

如果您不想将结构的字段更改为 属性,您可以覆盖结构的 ToString 方法。
如果未分配 DisplayMember,ComboBox 只需对数据源中的每个项目调用 .ToString(),以生成项目的文本。

public override string ToString()
{
    return Name;
}

然后您可以通过 comboBoxServers.SelectedValue 访问选定的服务器信息,其中 return Server

的整个实例
var selectedServer = (Server)comboBoxServers.SelectedValue;
selectedServer.ServerUrl;
selectedServer.ServerEnvironment; // ...