来自结构数组的 C# ComboBox

标签 c# struct combobox datasource

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

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 数据源?

最佳答案

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

但要使用 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 访问选定的服务器信息,它返回Server 的整个实例

var selectedServer = (Server)comboBoxServers.SelectedValue;
selectedServer.ServerUrl;
selectedServer.ServerEnvironment; // ...

关于来自结构数组的 C# ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41438050/

相关文章:

c# - 如何修复 Blazor 代码部分的 Intelisense 错误?

c - 无法将 C 结构传递给函数

c - 在结构数组中查找值

combobox - 在 Combobox 中的值发生变化时调用 WIX 中的自定义操作

c# - 具有多行并接受返回的 WPF C# ComboBox?

windows - 有没有办法跟踪来自 TComboBox 的滚动条消息?

c# - DrawUserPrimitives 无效操作异常

c# - 为什么我必须重建一个未更改的项目?

c# - ASP.NET MVC - 正确使用 View 模型和命令模式

ruby - `map` 基于条件