Laden...

CategoryListView:ListView

Erstellt von -acid- vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.754 Views
-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren
CategoryListView:ListView

Guten Morgen 🙂

Ich möchte mir ein Control schreiben, welches mir Kategorien auflistet (siehe Anhang). Habe es bisher mit dem ListView-Control in Verbindung mit LargeImageView versucht. Sieht ansich ganz gut aus, nur steht der Text immer unter dem Bild.

Jetzt meine Frage: Wie gehe ich am besten an die Sache ran? Soll ich OwnerDraw nutzen und selbst zeichnen? Oder gibt es etwas Besseres? Vielleicht wäre es dann am sinnvollsten ich leite meine Klasse von ListView ab und überschreibe OnPaint, zeichne dann mein Image selbst und füge zwei Properties mit Headline und Text ein. Ich habe nur die Befürchtung, dass dann die die automatische Umbruchsortierung der Symbole samt Text nicht mehr korrekt funktioniert...

Bitte helft mir 🤔

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

Bin gerade dabei das Control zu fummeln. Momentan noch mehr schlecht als recht, aber das kommt noch. Habe mir nun eine Klasse "CategoryListView" (abgeleitet von ListView) und eine Klasse "CategoryListViewItem" (abgeleitet von ListViewItem) geschrieben. Wie kann ich denn nun der CategoryListView-Klasse sagen, dass er nicht die standard ListViewItems sondern meine CategoryListViewItem-Klasse nimmt?

Muss ich das in eine Klasse packen oder wie funktioniert das?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo -acid-,

was heißt "dass er nicht die standard ListViewItems sondern meine CategoryListViewItem-Klasse nimmt"? An welcher Stelle?

herbivore

-
-acid- Themenstarter:in
885 Beiträge seit 2004
vor 18 Jahren

Huhu 🙂

Also ich habe zwei neue Klassen gemacht:

class CategoryListView : ListView
class CategoryListViewItem : ListViewItem

In der CategoryListViewItem-Klasse gibt es nun eine neue Property: HeadlineText

Nun möchte ich gerne, dass die CategoryListView-Klasse meine CategoryListViewItem-Klasse benutzt, damit ich in der CategoryListView-Klasse auf die Items mit den neuen Properties Zugriff habe. Der Zugriff erfolgt dann im überschriebenen OnDrawItem-Event der CategoryListView-Klasse.

Hoffe du hast das verstanden =)

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo -acid-,

soweit war das schon klar. Dann vielleicht allgemein:

(*) Wenn du eine Klasse überschreibst, kannst du die Typen und Properties sowie von Parameter und Rückgabewerten von Methoden nicht ändern. Du kannst insofern nicht (zur Compile-Zeit) verhindern, dass ein Benutzer der Klasse ListViewItems übergibt. Du kannst aber (zur Laufzeit) z.B. eine Exception werfen.

Wenn das ListView selbst ListViewItems erstellt, musst du die entsprechenden Methoden und Properties überschreiben und dieses Verhalten so abändern, dass CategoryListViewItems erstellt werden.

Wenn du auf Eigenschaften und Methoden von CategoryListViewItem zugreifen willst, wirst du in der Regel casten müssen - wegen (*).

herbivore

59 Beiträge seit 2005
vor 18 Jahren

Guten Tag -acid-.

Der folgende Code implementiert zwar nicht ListViewItems sondern ColumnHeaders,
aber die Problematik scheint mir ähnlich gelagert.

Die Knackpunkte bei der Sache waren das "überblenden" der Column-Eigenschaft,
sowie des Indexers in der LVColumnCollection-Klasse mit dem "new-Modifizierer".

 
namespace TestControl
{
  [DefaultProperty("Columns")]
  public class LV : ListView
  {
    public LV()
    {
      mColumns = new LVColumnCollection(this);
      this.View = View.Details;
    }

    private LVColumnCollection mColumns;
    
    [Category("Verhalten")]
    [EditorAttribute(typeof(System.ComponentModel.Design.CollectionEditor), typeof(UITypeEditor))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    
    public new LVColumnCollection Columns
    {
      get { return mColumns; }
    }
    
  }

  public class LVColumnCollection : System.Windows.Forms.ListView.ColumnHeaderCollection
  {
    public LVColumnCollection(LV owner) : base(owner)
    {
      mColumns = new ArrayList();
      mOwner = owner;
    }

    private LV mOwner;
    private ArrayList mColumns;

    public new LVColumnHeader this[int index]
    {
      get { return (LVColumnHeader) this.mColumns[index]; }
      set { this.mColumns[index] = value; }
    }


  }

  public class LVColumnHeader : ColumnHeader
  {
    public LVColumnHeader()
    {
      DisplayIndex += 1;
      mFormat = "{0}";
    }

    private string mFormat;

    [DefaultValue("{0}")]
    public string Format
    {
      get { return mFormat; }
      set { mFormat = value; }
    }
  }
}

Grüße und hoffe es hilft ein wenig weiter.

HoGi

2b | !2b = 0xff