我有一个看起来像这样的结构:
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/