Autor Beitrag
Rahvin
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 20.02.09 10:18 
Hallo,

ich möchte eine Datagridviewcombobox haben, welche mir in dem DropDown-Menü zusätzlich ein kleines Icon anzeigt.
Dazu übergebe ich meine von Datagridviewcomboboxcolumn abgeleiteten Klasse eine ImageList, welche die Icons enthält die angezeigt werden sollen.

Das Problem ist, dass ich die ImageList an das entsprechende EditingControl weiterleiten muss. Dazu übergebe ich die Liste zunächst an meine von Datagridviewcomboboxcell abgeleitete Klasse:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
        public DataGridViewComboBoxWithIconColumn(ImageList list, DISPLAYSTYLE displayStyle): base()
        {
            list.Tag = displayStyle;
            this.CellTemplate = new DataGridViewComboBoxWithIconCell(list);
        }


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        private static ImageList _iList;
        
        public DataGridViewComboBoxWithIconCell() : this(null) {}
            
        public DataGridViewComboBoxWithIconCell(ImageList list): base()
        {
            if (list != null)
                _iList = list;
        }


Und hier liegt das Problem. Selbst wenn ich die ImageList an das EditingControl übergebe, erstellt das Datagridview scheinbar eine neue Instanz der Datagridviewcomboboxcell und somit ist die Liste nicht mehr verfügbar. Ich habe das erstmal gelöst, in dem ich die Liste in der Datagridviewcomboboxcell in eine statischen Variablen speichere und die Liste nur zuweise, wenn der entsprechende Konstruktor aufgerufen wird. Das funktioniert soweit auch ganz gut für eine Spalte aber sobald ich zwei Spalten verwende überschreibt die zweite Spalte die ImageList und beide Spalten haben dann die Icons von Spalte2, was auch logisch ist, denn die Liste wird ja statisch gespeichert.
Gibt es eine Möglichkeit um das Problem zu umgehen. Es würde wahrscheinlich genügen, wenn ich aus der Cell-Klasse irgendwie auf die Column-Klasse zugreifen könnte um die ImageList aus der Column zu erhalten aber das habe ich noch nicht hingekriegt :(.

Ich hoffe, ich habe mich halbwegs verständlich ausgedrückt und bin für jede Hilfe dankbar :).
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 20.02.09 10:40 
Hallo,

das Problem liegt darin, dass das DataGridView insgesamt genau eine solche DataGridViewComboBox enthält - gleichgültig, wie viele Spalten so definiert werden. Diese ComboBox wird aktiviert, wenn die betreffende Zelle zur Eingabe (und damit zum Aufklappen) aktiviert wird.

Du hast zwei Möglichkeiten: Entweder Du benutzt die vollständige Lösung mit allen drei Klassen: Column, Cell, EditingControl - siehe meine Lösung mit MaskedTextBox oder das Verfahren mit DateTimePicker. Oder Du passt eine "normale" ComboBox beim DataGridView.EditingControlShowing-Ereignis mit OwnerDraw und DrawItem-Ereignis an.

Gruß Jürgen
Rahvin Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 20.02.09 10:57 
Danke erstmal für die Antwort :).

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
Du hast zwei Möglichkeiten: Entweder Du benutzt die vollständige Lösung mit allen drei Klassen: Column, Cell, EditingControl - siehe meine Lösung mit MaskedTextBox oder das Verfahren mit DateTimePicker. Oder Du passt eine "normale" ComboBox beim DataGridView.EditingControlShowing-Ereignis mit OwnerDraw und DrawItem-Ereignis an.
Gruß Jürgen


Ich benutze ja die vollständige Lösung mit allen 3 Klassen. Das Problem ist die ImageList unter den 3 Klassen auszutauschen. Gibts dafür eine sinnvolle Lösung? Die Beispiele haben mir für mein Problem leider nich weitergeholfen.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 20.02.09 13:03 
Hallo,

bei meinem Vorgehen mit der MaskedTextBox müsste das, wie ich die Mask-Eigenschaft verarbeite, Deinem Vorgehen bei der ImageList entsprechen. Ich erinnere mich, dass ich über genau diesem Problem (individuelle Mask je Spalte) längere Zeit gegrübelt hatte.

Gruß Jürgen
Rahvin Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Fr 20.02.09 16:24 
Ich hab mir dein Beispiel nochmal näher angeguckt und meinen Quelltext entsprechend geändert und siehe da: Es klappt :).

Ich verstehe zwar noch nicht ganz, wieso es jetzt klappt aber immerhin ;). Vielleicht sollte ich mich demnächst nochmal etwas tiefer in das Thema einlesen ;).

Nochmal Danke !