2017-01-03 62 views
1

の配列から、私はこのようになります構造体があります。C#コンボボックス構造体

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

...、そこに約8レコードを読み取る:その後、私は構造体のリストを作成

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

を小さなXMLファイルから。これがうまく機能している、と私は、デバッガで「MyServers」の上にマウスを置くならば、それは次のようになります。私はMessageBox.Show(MyServers[0].ServerName);ような何かを行う場合

MyServers Count=8 
    [0] {MyApp.Server} 
    ServerEnvironment "DEV" 
    ServerName   "My Dev Server #1" 
    ServerUrl   "https://mydev1.mycompany.com/" 
    [1] {MyApp.Server} 
etc... 

そして、その期待値を表示します。

私がしたいのは、ServerNameフィールドからComboBoxを作成することです。ユーザーが選択すると、ComboBoxのSelectedIndexプロパティを使用して、選択したServerNameの他の情報(ServerUrlとServerEnvironment)にアクセスすると思います。

私はこのような何かを考えていた:

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

しかし、私は働く何かを見つけるように見えることはできません。これは可能ですか、またはServerName文字列のみを持つ別の単純なリストを作成し、ComboBoxデータソースに使用する必要がありますか?

答えて

2

DisplayMemberは、名前をコンボボックスのテキストとして表示します。
次にcomboBox.SelectedValueはオブジェクト全体を返します。

しかしDisplayMemberを使用するために、あなたはあなたがあなたの構造体のToStringメソッドをオーバーライドすることができますプロパティに構造体の変更フィールドをしたくない場合は財産

public struct Server 
{ 
    public string ServerName { get; set; } 
} 

comboBoxServers.DisplayMember = "ServerName"; 
comboBoxServers.DataSource = MyServers; 

にフィールドServerNameを変更する必要があります。
ComboBoxは、DisplayMemberが割り当てられていない場合、データソース内のすべての項目に対して単に.ToString()を呼び出し、項目のテキストを生成します。

public override string ToString() 
{ 
    return Name; 
} 

次に、あなたは、オブジェクトの名前**財産**を指定_... `DisplayProperty`から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プロパティで指定されたコレクションに含まれるオブジェクトプロパティの名前を指定するStringです。

ValueMember:ListControl内の項目の実際の値として使用するプロパティのパスを取得または設定します。このStringは、DataSourceプロパティ値の単一のプロパティ名、または最終データバインドオブジェクトのプロパティ名に解決されるピリオドで区切られたプロパティ名の階層を表します。ユーザーがcomboBoxServersで1を選択したときに

だから今は

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

の全インスタンスを返したcomboBoxServers.SelectedValueて選択したサーバの情報にアクセスすることができます... _フィールドでは機能しません。 – Fabio

1

のような選択ServerNameのために、他の情報(SERVERURLとServerEnvironment)にアクセスすることができますリスト・サーバーを作成します。

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

OPの構造体にフィールドしかないため、これは機能しません。データバインドはプロパティでのみ機能します。 – Fabio

+0

提案していただきありがとうございます。私はこれを試しましたが、このエラーが発生しました:新しいディスプレイメンバーにバインドできません。 –

+1

リストのプロパティを追加しますか?public string ServerEnvironment {get;セット; } パブリック文字列ServerName {get;セット; } –