2010-11-23 6 views
0

J'ai créé une méthode qui lierait toutes les tables avec des clés primaires dans un menu déroulant comme celui-ciméthode ne fonctionne pas correctement

public void PrimaryKeyTable() 
     { 
SqlConnection sConnection = new SqlConnection("Server=192.168.10.3;DataBase=GoalPlanNew;User Id=gp;Password=gp"); 

      //To Open the connection. 
      sConnection.Open(); 

      string selectPrimaryKeys = @"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 

             ORDER BY TABLE_NAME"; 

      SqlCommand sCommand = new SqlCommand(selectPrimaryKeys, sConnection); 

      try 
      { 
       DataSet dsListOfPrimaryKeys = new DataSet("INFORMATION_SCHEMA.TABLE_CONSTRAINTS"); 
       SqlDataAdapter dass = new SqlDataAdapter(selectPrimaryKeys, sConnection); 
       dass.TableMappings.Add("Table", "INFORMATION_SCHEMA.TABLE_CONSTRAINTS"); 
       dass.Fill(dsListOfPrimaryKeys); 

       DataViewManager dsvaa = dsListOfPrimaryKeys.DefaultViewManager; 
       cmbResults.DataSource = dsListOfPrimaryKeys.Tables["INFORMATION_SCHEMA.TABLE_CONSTRAINTS"]; 
       cmbResults.DisplayMember = "NAME"; 
       cmbResults.ValueMember = (""); 
      } 
      catch (Exception ex) 
      { 
       //All the exceptions are handled and written in the EventLog. 
       EventLog log = new EventLog("Application"); 
       log.Source = "MFDBAnalyser"; 
       log.WriteEntry(ex.Message); 
      } 
      finally 
      { 
       if (sConnection.State != ConnectionState.Closed) 
       { 
        sConnection.Close(); 
       } 
      } 
     } 

mais au lieu de lier les tables avec des clés primaires, il donne quelque chose comme ça dans la liste déroulante

System.Data.DataRowView 
System.Data.DataRowView...and so on 

Pouvez-vous indiquer où je me suis trompé?

+0

êtes-vous sûr de cette ligne 'cmbResults.DisplayMember =" Nom ";' nom de colonne est '" NAME "' – FosterZ

Répondre

4

pas Si le DisplayMember être "TABLE_NAME"

+0

A moins que la liaison de données ne prenne en charge l'accès à l'indexeur de l'objet lié, je doute que cela fonctionne. DisplayMember, autant que je l'ai jamais connu devrait être le nom de la chaîne d'une propriété physique dans la classe DataRowView. –

+0

@Adam Je n'ai jamais utilisé cela, mais je l'ai juste essayé dans une application graphique et ça marche très bien –

+0

Le code suivant fonctionne dans une application WinForms. DataTable dt = new DataTable ("Membres"); dt.Columns.Add ("MemberId", typeof (int)); dt.Columns.Add ("MemberName", typeof (string)); dt.Rows.Add (nouvel objet [] {1, "Membre un"}); dt.Rows.Add (nouvel objet [] {2, "Member Two"}); comboBox1.DataSource = dt; comboBox1.DisplayMember = "Nom du membre"; comboBox1.ValueMember = "MemberId"; –

2

Il n'y a pas de propriété sur le DataRowView appelée "NAME". La propriété DisplayMember prend un nom de chaîne d'une propriété sur l'objet que vous liez et utilise la réflexion pour obtenir la valeur réelle. Ce que vous essayez de faire est de fournir "NAME" comme nom d'une colonne retournée et donc présente dans le DataRowView si vous l'avez indexée.

Cela ne fonctionnera malheureusement pas. Un exemple d'une liste liée de travail:

http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.displaymember.aspx

Je ne suis pas sûr si vous pouvez lier votre DataRowView sans l'emballer dans une autre classe, ce qui est en soi une solution trop onéreuse.

Lorsque le DisplayMember ne peut pas être résolu, il par défaut en cours d'exécution ToString() sur l'objet lié: DataRowView.ToString() retourne le nom du type, car il ne remplace pas ToString() - c'est ce qui se passe dans votre cas.

Mise à jour: les noms de colonne pour les tables de données. Je ne trouve aucune documentation à ce sujet pour le moment, mais si vous définissez DisplayMember sur "TABLE_NAME", cela fonctionnera également. Mon explication parle de propriétés de classe, c'est le cas des objets liés, mais il est aussi possible qu'il prenne des valeurs d'indexeur bien que je ne sache pas comment cela fonctionne sous le capot.

Mise à jour 2: est un bel aperçu ici, la CurrencyManager se chargera le nom de colonne:

http://www.akadia.com/services/dotnet_databinding.html