Thema: Prism Bug in der List-View?

Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#1

Bug in der List-View?

  Alt 22. Feb 2004, 18:52
Bleiben wir doch gleich beim Thema: "Was ist hier los?" Basierend auf dem Programm aus diesem Beitrag wollte ich die List-View mit einer Sortierung ausstatten. Lässt sich ja recht fix nachvollziehen:
Delphi-Quellcode:
type
  TMainForm = class(System.Windows.Forms.Form)
  { ... }
  private
    type
      TListViewItemSorter = class(TInterfacedObject, IComparer)
      private
        FColumn: Integer;
        FDescending: Boolean;
        procedure SetColumn(Value: Integer);
      public
        function Compare(x: &Object; y: &Object): Integer;
        property Column: Integer read FColumn write SetColumn;
      end;
  private
    FSorter: TMainForm.TListViewItemSorter;

{ ... }


implementation

function TMainForm.TListViewItemSorter.Compare(x: &Object; y: &Object): Integer;
begin
  Result := System.String.Compare(ListViewItem(x).SubItems[FColumn].Text,
    ListViewItem(y).SubItems[FColumn].Text);

  if FDescending then
    Result := -Result;
end;

procedure TMainForm.TListViewItemSorter.SetColumn(Value: Integer);
begin
  if FColumn = Value then
    FDescending := not FDescending
  else
  begin
    FDescending := False;
    FColumn := Value;
  end;
end;
Im "Create"-Construktor der Form muss dann nach der "TODO:"-Aufforderung von Borland dieser IComparer erzeugt und an die List-View übergeben werden:
Delphi-Quellcode:
FSorter := TMainForm.TListViewItemSorter.Create;
lv.ListViewItemSorter := FSorter;
Und dann fehlt eigentlich nur noch der Spaltenklick:
Delphi-Quellcode:
procedure TMainForm.lv_ColumnClick(sender: System.Object;
  e: System.Windows.Forms.ColumnClickEventArgs);
begin
  FSorter.SetColumn(e.Column);
  lv.Sort;
end;
So weit, so gut ... Aber wenn ich jetzt die Reload-Funktion (4. Button in der Toolbar) aufrufe, dann fehlen plötzlich Einträge, usw. Ich dachte zuerst an ein Problem mit der Registry. Aber ich habe den Code mal deaktiviert und in der "LoadRegKeys"-Prozedur einfach Fake-Items erzeugen lassen:
Delphi-Quellcode:
  for i := 1 to 100 do
  begin
    lv.Items.Add(Convert.ToString(i) + '. Eintrag');
    for j := 1 to 4 do
    begin
      lv.Items[lv.Items.Count-1].SubItems.Add(
        Convert.ToString(j) + '. Untereintrag'
      );
    end;
  end;
Das gleiche Ergebnis. Die Sortierung funktioniert zwar wunderbar, aber sobald man die Items neu lädt, werden einige nicht angezeigt. Meist sind das die SubItems. Was ist die Ursache?

btw: Diese Sortiergeschichte stammt aus der Borland-Demo "CultureInfo". So gut bin ich mit .NET dann doch noch nicht, dass ich solche Sachen mal eben so nebenbei schreibe.
  Mit Zitat antworten Zitat