2010-11-23 28 views
0

ich eine Methode erstellt haben, die alle Tabellen mit Primärschlüssel in einem Drop-Down-ähnlicheMethode funktioniert nicht richtig

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(); 
       } 
      } 
     } 

sondern binden die Tabellen mit Primärschlüssel binden würde es so etwas wie dies in der schenkt dropdown

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

Kannst du plz darauf hinweisen, wo ich falsch gelaufen bin?

+0

sind Sie diese Linie sicher 'cmbResults.DisplayMember =" NAME ";' Spaltenname ist '" NAME "' – FosterZ

Antwort

4

Sollte die Display nicht "TABLE_NAME" seine

+0

Wenn die Datenbindung den Zugriff auf den Indexer des gebundenen Objekts nicht unterstützt, bezweifle ich, dass dies funktioniert. DisplayMember sollte, soweit ich es jemals kannte, der String-Name einer physischen Eigenschaft der DataRowView-Klasse sein. –

+0

@Adam Ich habe das noch nie benutzt, aber ich habe es einfach in einer GUI-App ausprobiert und es funktioniert einwandfrei –

+0

Der folgende Code funktioniert in einer WinForms-Anwendung. DataTable dt = neue DataTable ("Mitglieder"); dt.Columns.Add ("MemberId", typeof (int)); dt.Columns.Add ("MemberName", typeof (string)); dt.Rows.Add (neues Objekt [] {1, "Member One"}); dt.Rows.Add (neues Objekt [] {2, "Mitglied Zwei"}); comboBox1.DataSource = dt; comboBox1.DisplayMember = "Mitgliedsname"; Kombinationsfeld1.ValueMember = "MitgliedId"; –

2

Es gibt keine Eigenschaft auf der DataRowView namens "NAME". Die DisplayMember-Eigenschaft übernimmt den Namen einer Eigenschaft für das zu bindende Objekt und verwendet die Reflektion, um den tatsächlichen Wert zu erhalten. Es sieht so aus, als ob Sie "NAME" als Name einer zurückgegebenen Spalte angeben und somit in der DataRowView angezeigt werden, wenn Sie sie indiziert haben.

Das wird leider nicht funktionieren. Ein Beispiel für eine Arbeits gebunden Liste:

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

Ich bin mir nicht sicher, ob Sie Ihre DataRowView ohne es innerhalb einer anderen Klasse Einwickeln binden kann, was an sich nicht zu belastend eine Lösung ist.

Wenn die DisplayMember nicht aufgelöst werden kann, defaults es läuft ToString() auf dem gebundenen Objekt: DataRowView.ToString() den Typnamen zurückgibt, weil es nicht ToString() enthebt - das ist, was in Ihrem Fall geschieht.

Update: Entschuldigung, es funktioniert auch auf Spaltennamen für Datentabellen. Ich kann im Moment keine Dokumentation finden, aber wenn Sie DisplayMember auf "TABLE_NAME" setzen, wird es auch funktionieren. Meine Erklärung bezieht sich auf Klasseneigenschaften, dies ist der Fall bei gebundenen Objekten, aber es ist auch der Fall, dass es Indexer-Werte annehmen kann, obwohl ich nicht weiß, wie dies unter der Haube funktioniert.

Update 2: hier ist eine schöne Übersicht, die CurrencyManager die Spaltennamen behandelt:

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