Autor Beitrag
avoid
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: So 01.11.15 15:49 
ich hab ein dataSet mit mehreren Tabellen. Ich speichere und lade dieses dataSet als Xml.
ich möchte in einer meiner Tabellen die letzte spalte mit einem bild füllen und dieses auch im dataGridView anzeigen.
das bild habe ich bereits als "Properties.Resources.BeispielBild" in meiner anwendung.
leider stellt mich der zusammenhang vor einige schwierigkeiten und ich verstehe nicht warum es nicht klappt.

als erstes habe ich die spalte hinzugefügt und auf dem DatenTyp "System.String" gelassen.
dann habe ich das GridView auf "DataGridViewImageColumn" eingestellt.
als nächstes habe ich versucht eine neue Zeile ein zu tragen.

ausblenden C#-Quelltext
1:
myRow["EditIcon"] = Properties.Resources.BeispielBild;					


die IDE und der Compiler haben kein Problem mit dieser Zuweisung (sie kennen ja auch weder den typ der Tabelle noch den der GridView Darstellung) aber die Anwendung meckert weil String zu Draw nicht geht.

als Lösung dachte ich mir, ich könnte den DatenTyp der spalte auf "System.Object" stellen, weil Draw ja ein Objekt der Klasse sein müsste.
leider geht das nicht weil ich dann beim speichern eine Fehlermeldung bekomme das die XML Schnittstelle kein Draw kann.

dann hab ich ca. Zwei Stunden das Google befragt und einige hinweise gefunden in denen direkt auf eine externe Grafikdatei verwiesen wird.
dabei wird "System.byte[]" verwendet aber ich habe keines der Beispiele zum laufen bekommen.

kann mir das mal einer verständlich erklären warum es ein "DataGridViewImageColumn" gibt, es aber keine Properties.Resources frisst.
oder muss ich jetzt anfangen mit System.Int32 in der spalte und diese dann beim Paint auszuwerten und zu ersetzen?
das kann es doch nicht sein oder?

Gruß,
avoid

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 01.11.15 16:41 
Wenn myRow["EditIcon"] ein byte[] ist dann
ausblenden C#-Quelltext
1:
myRow["EditIcon"] = new ImageConverter().ConvertTo(Properties.Resources.BeispielBild, typeof(byte[])));					


Wahrscheinlich ist es aber keine gute Idee die Images in einer DataTable zu verwalten. Wenn du dir das aus Resourcen holst, also unabhängig von den Daten vorhanden ist, wäre es eher üblich anstatt des Images einen Index in der DataTable zu verwalten (warum auch das ganze Bild ins Xml schreiben, im schlimmsten Fall sogar mehrfach, wo es in den Resourcen eh schon vorhanden ist?) und dann das Bild entsprechend des Images zu zeichnen. Ich benutze das DataGridView zu selten (jenseits von Spielzeugtools) aber es gibt doch bestimmt ein Verfahren einer Column eine ImageList mitzugeben die dann anhand des Indexes als Quelle zum zeichnen benutzt wird. Im Zweifel sollte sich solch eine Column auch leicht aus einer DataGridViewImageColumn entwickeln lassen.
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: So 01.11.15 21:35 
also doch nen Index der beim Paint Event durchlaufen wird und je nach fall die passenden Recourcen an zeigt. :?

klar kann ich das so machen, auf die weise färbe ich schon Text und Zeilen ein.
aber frisst das nicht mehr Rechenleistung als die Bilder in der XML zu haben?
oder hab ich das mit der List falsch verstanden ... ?

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 01.11.15 22:49 
Zitat:
aber frisst das nicht mehr Rechenleistung als die Bilder in der XML zu haben?


Es frisst jedenfalls mehr Plattenplatz. Wie oft das Image im XML ist weißt aber nur du. Bedenke du hast es nach dem Laden aus dem XML entsprechend oft im Speicher und eben nicht nur einmal. Ob das ein Problem ist kommt halt auf das genau wie oft an. Wie du das dann zeichnest ist dann mal kein Problem der Leistung/Resourcen. Ob du es manuell machst oder es die ImageColumn machen lässt es kostet denn gleichen Aufwand (mal ausgenommen den Fall das du Unsinn implementierst ;) )

Edit: Eine DataColumn die eine ImageList nimmt und damit eine int Spalte als Images anzeigt,

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
public class DataGridViewImageListColumn : DataGridViewColumn
{
    public DataGridViewImageListColumn() : base(new DataGridViewImageListColumn.Cell()) { }

    public ImageList Images { get; set; }

    public override object Clone()
    {
        DataGridViewImageListColumn col = base.Clone() as DataGridViewImageListColumn;
        col.Images = this.Images;
        return col;
    }

    public override DataGridViewCell CellTemplate
    {
        get { return base.CellTemplate; }
        set
        {
            if (value != null)
            {
                if (!(value is DataGridViewImageListColumn.Cell))
                    throw new InvalidCastException("Wrong cell type, DataGridViewImageListColumn can only contain DataGridViewImageListColumn.Cell");
                base.CellTemplate = value;
            }
        }
    }

    public class Cell : DataGridViewImageCell
    {
        protected override object GetFormattedValue(object value,
            int rowIndex, ref DataGridViewCellStyle cellStyle,
            TypeConverter valueTypeConverter,
            TypeConverter formattedValueTypeConverter,
            DataGridViewDataErrorContexts context)
        {
            if (value is Image)
                return value;

            int index = Convert.ToInt32(value); // value needs to be an int type if not this throws an Exception

            DataGridViewImageListColumn column = OwningColumn as DataGridViewImageListColumn;
            if (column == null)
                throw new ArgumentException("owning column of a DataGridViewImageListColumn.Cell must be a DataGridViewImageListColumn");

            if (column.Images == null)
                throw new ArgumentNullException("Images Property of the owning column must be set");

            if (index < 0 || index >= column.Images.Images.Count)
                throw new ArgumentOutOfRangeException("Image Index out of range");

            return column.Images.Images[index];
        }
    }
}

Für diesen Beitrag haben gedankt: avoid
avoid Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 230
Erhaltene Danke: 4

MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
BeitragVerfasst: Mo 02.11.15 20:59 
ich dank dir,
ich hab die Grafiken jetzt erst mal als Byte Array in der XML.
so groß sind die ja zum glück nicht.
aber du hast schon recht, in der endgültigen Version sollte ich besser nen Index verwenden.

_________________
Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke