【问题标题】:C# ComboBox from Array of Structs结构数组中的 C# ComboBox
【发布时间】:2017-05-17 05:21:03
【问题描述】:

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

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

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

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

...从一个小的 XML 文件中读取大约 8 条记录。这运行良好,如果我将鼠标悬停在调试器中的“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 数据源?

【问题讨论】:

    标签: c# struct combobox datasource


    【解决方案1】:

    这可能对你有用

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

    DisplayMember:获取或设置要为任何 ListControl 显示的属性。指定对象属性名称的字符串,该对象属性包含在由 DataSource 属性指定的集合中。

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

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

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

    【讨论】:

    • 来自DisplayProperty ...指定对象的名称property...,因此它不适用于字段。
    【解决方案2】:

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

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

    public struct Server
    {
        public string ServerName { get; set; }
    }
    
    comboBoxServers.DisplayMember = "ServerName";
    comboBoxServers.DataSource = MyServers;
    

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

    public override string ToString()
    {
        return Name;
    }
    

    然后您可以通过comboBoxServers.SelectedValue 访问选定的服务器信息,它返回Server 的整个实例

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

    【讨论】:

    • 这听起来是个好主意,但是当我尝试添加 { get;放; } 到 ServerName 声明(public String ServerName { get; set; }),我得到一个编译器错误,我试图为其分配一个值:Server TempServer; TempServer.ServerName = (值); TempServer.ServerUrl = (值); TempServer.ServerEnvironment =(值);我的服务器。添加(临时服务器);。错误是使用未分配的局部变量“TempServer”。在我添加 { get; 之前这是有效的放; }。我需要改变分配值的方式吗?
    • 要使用属性,您需要使用Server TempServer = new Server();,但您可以直接覆盖ToString() 作为另一种方法。
    • 万岁! { get; set; }Server TempServer = new Server(); 工作。感谢您帮助我浏览所有棘手的细节。改用 ToString() 是否有优势,或者在任何情况下都可以优先使用?还是两种方法都一样好?
    【解决方案3】:

    创建列表服务器:

    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" ;
    

    【讨论】:

    • 这不起作用,因为 OP 的结构只有字段。 DataBinding 仅适用于属性。
    • 感谢您的建议。我试过了,但得到了这个错误:无法绑定到新的显示成员。
    • 你是否为列表添加属性:public string ServerEnvironment { get;放; } 公共字符串服务器名称 { 获取;放; }
    • 我尝试添加 { get;放; } 到属性,但这导致了不同的错误。在将值添加到 MyServers 列表之前,我将值分配给临时服务器结构(称为 TempServer)的地方,我得到了编译器错误:使用未分配的局部变量“TempServer”。这以前有效。使用 { get; 时是否需要更改赋值方式?放; }?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多