La liste écrase tous les éléments d’une boucle foreach à la dernière valeur

J’essaye de construire une application Windows dans laquelle il y a une liste déroulante et pendant Load (), je remplis cette liste déroulante avec toutes les chaînes de connexion disponibles dans mon fichier app.Config.

Voici l’extrait app.Config:

      

J’ai créé une classe CompareResult dans laquelle j’essaie d’obtenir toutes les valeurs de app.Config et de l’afficher dans la liste déroulante.

 namespace RecordComparisonTool_Win { public class ConnectionSsortingng { public ssortingng name { get; set; } public ssortingng conSsortingng { get; set; } public ssortingng provider { get; set; } } public class CompareResult { public List GetConnection() { List conStr = new List(); ConnectionSsortingng conn = new ConnectionSsortingng(); foreach (ConnectionSsortingngSettings css in ConfigurationManager.ConnectionSsortingngs) { if (!(css.Name == "LocalSqlServer" || css.Name == "LocalMySqlServer")) { conn.name = css.Name; conn.conSsortingng = css.ConnectionSsortingng; conn.provider = css.ProviderName; conStr.Add(conn); } } return conStr; } } } 

Le problème est que lorsque j’essaie de le lier avec la zone de liste déroulante, il affiche trois enregistrements conformément au fichier app.Config, mais tous les enregistrements ont la même valeur que “SQLConnect-3”. Je ne parviens pas à trouver la raison pour laquelle la liste a été mise à jour avec “SQLConnect-3” pour tous les enregistrements. S’il vous plaît aider à corriger l’erreur. Voici l’extrait de code où je lie cette liste à ComboBox

 protected void LoadConnection() { CompareResult compareResult = new CompareResult(); List connectionSsortingng = new List(); connectionSsortingng = compareResult.GetConnection(); cbTokenLeft.DataSource = connectionSsortingng; cbTokenLeft.DisplayMember = "name"; cbTokenLeft.ValueMember = "conSsortingng"; } 

Ce:

 conn.name = css.Name; conn.conSsortingng = css.ConnectionSsortingng; conn.provider = css.ProviderName; conStr.Add(conn); 

Écrase votre référence ConnectionSsortingng chaque itération. Vous devez allouer un nouveau ConnectionSsortingng à chaque boucle:

 foreach (ConnectionSsortingngSettings css in ConfigurationManager.ConnectionSsortingngs) { if (!(css.Name == "LocalSqlServer" || css.Name == "LocalMySqlServer")) { var conn = new ConnectionSsortingng { name = css.Name; conSsortingng = css.ConnectionSsortingng; provider = css.ProviderName; } conStr.Add(conn); } } 

Déplacez la ligne ConnectionSsortingng conn = new ConnectionSsortingng(); à l’intérieur de la boucle la plus intérieure. C’est une classe de référence, et vous ajoutez la même instance à votre liste à plusieurs resockets.

  public List GetConnection() { List conStr = new List(); foreach (ConnectionSsortingngSettings css in ConfigurationManager.ConnectionSsortingngs) { if (!(css.Name == "LocalSqlServer" || css.Name == "LocalMySqlServer")) { ConnectionSsortingng conn = new ConnectionSsortingng(); conn.name = css.Name; conn.conSsortingng = css.ConnectionSsortingng; conn.provider = css.ProviderName; conStr.Add(conn); } } return conStr; } 

Comme vous instanciez votre ConnectionSsortingng dehors de votre boucle, la même instance est utilisée (et écrasée) pour toutes les itérations. Vous devez l’instancier dans votre boucle pour que chaque itération reçoive une nouvelle instance:

 foreach (ConnectionSsortingngSettings css in ConfigurationManager.ConnectionSsortingngs) { if (!(css.Name == "LocalSqlServer" || css.Name == "LocalMySqlServer")) { ConnectionSsortingng conn = new ConnectionSsortingng(); conn.name = css.Name; conn.conSsortingng = css.ConnectionSsortingng; conn.provider = css.ProviderName; conStr.Add(conn); } } 

Vous pouvez également exprimer le même code en utilisant LINQ:

 var conStr = ( from css in ConfigurationManager.ConnectionSsortingngs where !(css.Name == "LocalSqlServer" || css.Name == "LocalMySqlServer") select new ConnectionSsortingng { name = css.Name, conSsortingng = css.ConnectionSsortingng, provider = css.ProviderName, } ).ToList();