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