2009-06-09 3 views
0

Ich habe WPF DataGrid mit Combox-Spalte (ID ist realer Wert, Desc ist der angezeigte Wert) und wenn ich auf den Header dieser Spalte klickt, sortiert automatisch nach realem Wert (ID). Ich möchte nach angezeigtem Wert sortieren.WPF DataGrid nach ComboBox-Feld sortieren

Mein WPF Datagrid hat 4 Spalten: IdPerson, DescSchool, IdSchool und School. Spalte "Schule" ist comboBox mit diesen Werten: ItemSource = schoolTable.DefaultView, SelectedValueBinding = new Binding ("IdSchool"), SelectedValuePath = "IDSchool", DisplayMemberPath = "DescSchool"

schoolTable ist eine Tabelle mit zwei Spalten - IDSchool und DescSchool. Diese Tabelle wird nur als Datenquelle für die Combobox verwendet.

Ich habe versucht, die Lösung, wenn ich SortMemberPath = "DescSchool" eingestellt habe und zunächst funktioniert das - wenn ich auf den Header der Combobox Spalte klicken Sortierung erfolgt durch angezeigten Wert (weil es Wert der anderen Spalte gelesen) und nicht nach echtem Wert. Aber, wenn ich den Wert der Combobox ändere, ist der Wert der Spalte "DescSchool" immer noch der gleiche, so dass nach dieser Sortierung nicht mehr richtig funktioniert.

Irgendeine Idee?

Antwort

1

Einstellung SortMemberPath="Desc" (oder was Ihre Eigenschaft genannt wird) auf der DataGridComboBoxColumn sollte den Trick tun.

+0

Vielen Dank für Ihre Antwort. Ich habe das ausprobiert und diese Lösung funktioniert bei mir nicht für die Motive, die ich in meinem editierten ersten Post erklärt habe. –

0

Ich hatte auch dieses Problem und musste IComparable auf dem Typ, der sortiert wird, implementieren. In deinem Fall denke ich, dass es der Schultyp ist. Innerhalb IComparable, kehren diese:

return this.Desc.CompareTo((obj as School).Desc); 

Dies ist der einzige Weg, ich in der Lage war, zur Arbeit zu kommen, und durch das Fehlen von Antworten zu urteilen, nicht viele Leute wissen, einen besseren Weg ... sorry.

Dies funktioniert auch nur, wenn Sie Zugriff auf die Typen haben. Wenn dies eine Datentabelle oder etwas Ähnliches ist (im Gegensatz zu Entity Framework zum Beispiel), wird diese Lösung nicht funktionieren.

0

Ich hatte ähnliches Problem zu lösen mit WinForm und seine DataGridView relationale Daten in einer Combobox-Spalte im Raster angezeigt. Wollte die Spalte sortieren, aber die Sortierung würde nach dem ValueMember (einem int ID-Feld) und nicht nach dem DisplayMember (Textfeld wird angezeigt) sortieren. Ich verwendete ein typisiertes Dataset und legte seine typisierte Tabelle in ein DataView und dieses DataView als Datenquelle für eine BindingSource, die dann die Datenquelle für das Raster war. :-)

Nachdem ich mehrere Beiträge im Web gelesen hatte, war die Lösung, die für mich funktionierte, folgende: Im Code-Behind des typisierten Datasets fügte ich der typisierten Zeile meiner wichtigsten typisierten Tabelle einige benutzerdefinierte Eigenschaften hinzu .

Beispiel:

 public string ProvinceAtRow 
     { 
      get 
      { 
       string result = string.Empty; 
       if (!this.CustomerInfoRow.IsProvinceDescriptionNull()) 
       { 
        result = this.CustomerInfoRow.ProvinceDescription; 
       } 
       return result; 
      } 
     } 

Weiter im Code-Behind der WinForm, die eine Instanz meiner typisierte Dataset hat, habe ich eine Datacolumn auf die typisierte Tabelle. Beispiel (Code in dem Load-Ereignisse des winform):

 this.DSGrowth.LocalGrowthFactor.Columns.Add(
      new DataColumn("Province", typeof(string))); 

Weiter, wenn Daten in der Datenmenge hat, muß in der Spalte (n) füllen, die hinzugefügt wurden. Beispiel:

  //if we have data then have to fill in the colums we added to the TDS 
     if (this.DSGrowth.LocalGrowthFactor.Rows.Count > 0) 
     { 
      //fill columns so that can display on datagrid as columns that can be sorted 
      // ref http://www.daniweb.com/forums/thread283915.html 
      Array.ForEach<dsLocalGrowthFactor.LocalGrowthFactorRow>(     this.DSGrowth.LocalGrowthFactor.Rows.OfType<dsLocalGrowthFactor.LocalGrowthFactorRow>().ToArray(), 
       row => 
       { 
        row["Province"] = row.ProvinceAtRow; 
       } 
      ); 

      //accept changes on TDS so not to be prompted to save changes 
      this.DSGrowth.AcceptChanges(); 
     } 

     //set default sort 
     DataView dvFactors = new DataView(this.DSGrowth.LocalGrowthFactor); 
     dvFactors.Sort = "GrowthFactor DESC"; 
     this.BSLocalGrowth.DataSource = dvFactors; 

     this.DgvGrowth.DataSource = this.BSLocalGrowth; 
     if (this.DgvGrowth.Rows.Count > 0) 
     { 
      //select first row 
      this.BSLocalGrowth.MoveFirst(); 
      this.DgvGrowth.Rows[0].Selected = true; 
     } 

nicht mehr ComboBox Spalten und Sortierarbeiten!

Hoffe das hilft allen da draußen, die in einer ähnlichen Situation sind.

1

vor kurzem in ähnliches Problem fallen.

versuchen so etwas wie:

SortMemberPath="School.DescSchool" 

Hoffe, dass es Sie oder jemand anderes helfen!