2016-05-29 15 views
0

Ich kann diese Frage nicht richtig stellen. Ich habe es in 3 verschiedenen Foren gefragt und google seit ungefähr einer Woche gesucht, und nichts. Lassen Sie mich es so versuchen Sie es erneut hier und sehen, ob es eine andere Art und Weise zu fragen hilft ihr mir helfen ...WPF C# ComboBox Wert anzeigen

WPF C# MetroWindow MahApps.Metro Fenster mit - Combobox - Staatliche Codes (50 US-Bundesstaaten) Ich habe einen Datensatz und zog den Datensatz in das Kombinationsfeld in XAML. Hier ist die XAML

<ResourceDictionary> 
    <CollectionViewSource x:Key="StatesViewSource" 
          Source="{Binding States, Source={StaticResource PRx}}" /> 
</ResourceDictionary> 

Im Inneren des GRID ich den Datenkontext gesetzt:

<Grid DataContext="{StaticResource StatesViewSource}"> 

Dann wird die ComboBox

<ComboBox x:Name="CbState" 
     SelectedValuePath="StateCode" 
     ItemsSource="{Binding}" 
     DisplayMemberPath="StateCode" /> 

Wenn nun, dass es und ich höre, es funktioniert. Ich bekomme die State Codes in der Combobox; Das ist jedoch nicht das Problem oder das Problem, das ich gelöst habe. Was ich tun muss, ist die Datenbank abzufragen, den Patienten zu finden und die Adresse in das Fenster zurückzugeben. Jedes Feld wird mit Ausnahme der Combobox im Fenster angezeigt. Es wird immer der erste Status in der Liste - AL - Wert verwendet, obwohl der Statuscode für den Patienten MA ist.

Also, SQL funktioniert. Combobox zieht Werte. Aber ich kann die Combobox nicht dazu bringen, auf MA voreingestellt zu werden, wie es über das SQL zurückgegeben wird.

Hier ist ein C# -Code, den ich auch benutze.

private void ReturnPatient() 
{ 
    var patIdReturn = TxtPatId.Text; 
    var patSiteId = TxtTSiteCode.Text; 
    var preSql = Settings.Default.GetPatientProfile; 
    var param = " @p1 = '" + patIdReturn + "', @p2 = '" + patSiteId + "';"; 
    var sql = preSql + param; 
    var connectionString = Settings.Default.Dbconn; 
    using (var conn = new SqlConnection(connectionString)) 
    using (var cmd = new SqlCommand(sql, conn)) 
    { 
     try 
     { 
      conn.Open(); 
      var reader = cmd.ExecuteReader(); 
      while (reader.Read()) 
      { 
       TxtFirstName.Text = reader[0] as string; 
       TxtMi.Text = reader[1] as string; 
       TxtLastName.Text = reader[2] as string; 
       TxtLegacy.Text = reader[3] as string; 
       DobPicker.SelectedDate = reader[4] as DateTime? ?? new DateTime(); 
       TxtPhone.Text = reader[5] as string; 
       TxtAddr1.Text = reader[6] as string; 
       TxtAddr2.Text = reader[7] as string; 
       TxtCity.Text = reader[8] as string; 
       TbState.Text = reader[9] as string; 
       // trying a tbox instead of combobox, but this is where I want the Combobox for State. 
       TxtZip.Text = reader[10] as string; 
       //break for single row or you can continue if you have multiple rows... 
       break; 
      } 

      Log.Debug("Command executed and reader completed for ReturnPatient()"); 
     } 
     catch (SqlException ex) 
     { 
      // error handling 
     } 
     finally 
     { 
      // logging 
     } 
    } 
} 

ich versucht habe CbState.SelectedItem, CbState.SelectedValue, CbState.DisplayMemeber, etc ...

Bitte, ich weiß, dass dies möglich sein muss. BITTE HILFE

Mit freundlichen Grüßen,

Lost In ComboBox Hölle :)

+0

Einige Hinweise: Überprüfen Sie, was 'reader [9]' tatsächlich ergibt. Es ist eine schlechte Übung, hier numerische Offsets zu verwenden, weil Sie Probleme bekommen, wenn Ihr zugrunde liegendes qu oder die Tabellenstruktur ändert sich. Überprüfen Sie diesen Link: http://stackoverflow.com/questions/3391195/set-selecteditem-of-wpf-combobox – sprinter252

Antwort

0

Es scheint wirklich einfache Sache, und Sie grundlegende Punkt sind vermisst. Wenn Sie auf die Combobox klicken, können Sie die 50 Statusnamen als gebundene Elemente anzeigen? Wie oben empfohlen, überprüfen Sie den Wert von Reader [9] ist wirklich MA. Ich empfehle, genauer wie Leser ["yourcolumnname"] zu versuchen, um Verwirrung zu vermeiden.

Und versuchen Sie CbState.SelectedText = "MA";
oder CbState.Text = "MA";

Das ausgewählte Präfix könnte bedeuten, dass es vom Benutzer absichtlich ausgewählt werden muss.

Und stellen Sie sicher in XML, dass selectedindex = -1. Wenn der Index = 0 ist, berücksichtigt die Combobox den ersten befüllten Artikel AL als Standard.

Als letzte, wenn Sie nur schon fest 50 Staaten Namen in Combobox setzen müssen, warum Sie die Code-Struktur nicht ohne Bindung vereinfachen wie

CbState.Items.Add("AL"); 
.... 
CbState.Items.Add("MA"); 
CbState.Items.Add("NY"); 

Um Computer und fügte hinzu, bereits fest 50 Namen werden viel einfacher und schneller als das Binden. Wenn Sie nicht auf höherer Ebene arbeiten müssen, binden Sie sie.

Und als nicht-geringfügige Problem, Leser und Verbindung sollte in der richtigen Weise geschlossen werden.

0
cb_State.SelectedItem = (cb_State.ItemsSource as List<YourStateCodeClass>).Where(s=>s.StateCode == reader[9] as string).First(); 

aber ich sehe nicht, Ihre state Klasse und noch verwenden Sie DisplayMemberPath usw.

Falls es reiht können Sie

cb_State.SelectedItem = (cb_State.ItemsSource as List<string>).Where(s => s == reader[9] as string).First(); 

verwenden, und entfernen Sie die DisplayMemberPath und SelectedValuePath