2017-01-03 3 views
1

У меня есть структура, которая выглядит следующим образом:C# ComboBox из массива структур

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);, он отображает ожидаемое значение.

Теперь то, что я хотел бы сделать, это создать ComboBox из полей ServerName. Когда пользователь выбирает один, я думаю, что тогда я использовал свойство SelectedIndex для ComboBox для доступа к другой информации (ServerUrl и ServerEnvironment) для выбранного ServerName.

Я думал, что я мог бы сделать что-то вроде этого:

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

Но я не могу найти ничего, что работает. Возможно ли это, или мне нужно создать отдельный простой список с только строками ServerName и использовать его для ComboBox DataSource?

ответ

2

Вы можете использовать только DisplayMember, чтобы отображать имена в виде текста в combobox.
Тогда 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; // ... 
+0

Это звучит неплохо, но когда я попытался добавить {get; задавать; } в объявлении ServerName (public String ServerName {get; set;}), я получил ошибку компилятора, где я попытался присвоить ему значение: Server TempServer; TempServer.ServerName = (значение); TempServer.ServerUrl = (значение); TempServer.ServerEnvironment = (значение); MyServers.Add (TempServer) ;. Ошибка: использование неназначенной локальной переменной TempServer. Это работало до того, как я добавил {get; задавать; }. Нужно ли мне изменить способ присвоения значения? –

+1

Для использования свойств вам нужно использовать 'Server TempServer = new Server();', но вы можете просто переопределить 'ToString()' как еще один aproach. – Fabio

+0

Ура! '{get; задавать; } 'с' Server TempServer = new Server(); 'работал. Спасибо, что помогли мне разобраться со всеми сложными деталями. Существуют ли преимущества использования ToString() или какие-либо обстоятельства, когда это было бы предпочтительнее? Или оба метода одинаково хороши? –

1

Это может сделать трюк для вас

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

DisplayMember: Получает или задает свойство отображения для любого ListControl. Строка, указывающая имя свойства объекта, которое содержится в коллекции, указанной свойством DataSource.

ValueMember: Получает или задает путь для свойства, используемого в качестве фактического значения для элементов в ListControl. Эта строка, представляющая одно имя свойства значения свойства DataSource или иерархию имен свойств с разделителями периодов, которая разрешает имя свойства конечного объекта, привязанного к данным.

Так что теперь, когда пользователь выбирает один в comboBoxServers вы можете получить доступ к другой информации (ServerURL и ServerEnvironment) для выбранного ServerName как

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

От 'DisplayProperty' _... указав имя объекта ** собственности ** ... _ поэтому он не будет работать с полями. – Fabio

1

Создание списка сервера:

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

Затем добавить список для comboBox:

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

Это не сработает, потому что у структуры OP есть только поля. DataBinding работает только со свойствами. – Fabio

+0

Спасибо за предложение. Я попробовал это, но получил эту ошибку: не могу привязываться к новому элементу отображения. –

+1

Вы добавляете свойства для списка: public string ServerEnvironment {get; задавать; } public string Имя_сервера {get; задавать; } –

Смежные вопросы