Laden...

Hintergrundfarbe in Zellen ändern [BEANTWORTET]

Erstellt von saio vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.765 Views
S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren
Hintergrundfarbe in Zellen ändern [BEANTWORTET]

Hallo liebe Kollegen,

ich habe ein DatagridView, welches vom Designer automatisch erzeugt wird.
Die Datensätze für die Tabelle holt er sich aus meinem DataSet.

Jetzt möchte ich es hinzaubern, dass für eine Spalte alle Zellen eine dynamische Hintergrundfarbe bekommen. (Die Farbe steht ebenfalls in der Datenbank)

Man hat mir gesagt ich soll nix im Designer verändern aber wie soll ich es machen, dass jede Zelle ihre Farbe bekommt die auch in der DB steht, bzw wie spreche ich die einzelnen Zellen an um ihnen zu sagen, dass sie eine bestimmte bgcolor zugewiesen bekommen.

Ich bin für jede Hilfe dankbar.

Gruß saio

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

T
147 Beiträge seit 2005
vor 16 Jahren

Hallo saio,

also ich würde das Ganze über das CellFormatting oder CellPaint event des Datagridviews realisieren, wenn du die Properties and das Grid gebunden hast kannst du ja jederzeit die Values für die einzelne Row auslesen in diesen Events.

Mit dieser Lösung solltest du im Designer nichts machen müssen, einzig das Event musst du dran binden wobei das kannst du ja auch per Hand machen, dann wäre der Designer 1 zu 1 so wie zuvor.

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

Hallo Thorsten1983,

danke für deine Antwort 🙂

ich hab das jetzt soweit hingekriegt, nur hab ich noch ein Problem:

Wenn ich den Wert für die Farbe aus der Datenbank auslese, kann ich diesen leider dem Color Objekt nicht zuweisen:

   public Color getCellColor(String pResID){
            DBConnection DBC = new DBConnection();
            SqlDataReader dr;
            Color tempCol;

            dr = DBC.readDB("SELECT coco FROM ResTab WHERE resID = '" + pResID + "'");
            dr.Read();
            tempCol = (Color)Convert.ChangeType(dr["coco"], typeof(Color));
            dr.Close();
            return tempCol;            
        }

Dann Bringt er mir folgende Fehlermeldung:

Fehler 1 Ungültige Umwandlung von System.String in System.Drawing.Color

Kann ich den Result vom DataReader, irgendwie einem Colorobjekt als Wert zuweisen?

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

H
91 Beiträge seit 2007
vor 16 Jahren

Bei mir wurde das DGV nur einmal gefüllt. Daher hab ich das an RowsAdded gebunden:

        private void dgvVariations_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) {
            DataGridView dgv = (DataGridView)sender; 
            for (int i = 0; i < e.RowCount; i++) {
                DataGridViewTextBoxCell tbc = (DataGridViewTextBoxCell)dgv["Type",e.RowIndex+i]; 
                if (tbc != null && tbc.Value != null 
                        && tbc.Value.ToString() == "linked") 
                    tbc.[B]Style.BackColor[/B] = Color.DarkGray; 
            }
        }

EDIT: Ha, zu langsam X( - Welchen Typ hat denn Deine Farbe in der DB?

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

hallo haymo,

in der db ist der Wert für die Farbe als varchar(MAX) festgelegt - der Result aus dem DataReader ist jedoch vom Typ Object.

ein Beispielwert aus einem Datensatz hat z.B. folgende Zeichenfolge: 'Color [Red]'

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

H
91 Beiträge seit 2007
vor 16 Jahren

Hm. 'Red' ist aber keine Farbe - sondern ein String. Entweder kannst Du

  1. die Farben in der DB numerisch speichern und dann in .NET zu System.Color konvertieren, oder
  2. Color.FromName(coc) zum konvertieren nehmen, oder halt
  3. "zu Fuß":
... 
if (coc == "Red") { 
    return Color.Red; 
} else if ...

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

hm ja zu Fuß ists ein bisschen umständlich aber ich habs jetzt so versucht, dass ich der Color.Name Eigenschaft den String-Wert zuweisen wollte:

tempCol.Name = Convert.ToString(dr["coco"]);

Da krieg ich aber auch eine Fehlermeldung 🙁

Fehler 1 Einer Eigenschaft oder einem Indexer "System.Drawing.Color.Name" kann nichts zugewiesen werden -- sie sind schreibgeschützt. C:\VisualStudio2005\Projects\PRP\PRP\Frm_Main.cs 298 13 PRP

Gibt es dafür keine Elegante Lösung? Mit Konvertieren gehts ja irgendwie auch nicht so richtig.

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

H
91 Beiträge seit 2007
vor 16 Jahren

Hast Du mal Color.FromName(bla) versucht?

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

H
91 Beiträge seit 2007
vor 16 Jahren

Selbst, wenn das geht - elegant find ich das nicht! Du mußt sicherstellen, daß in der DB alle "Farb"-Strings aus der KnownColor enumeration sind. Sonst eine Fallback/Default-Farbe nehmen...

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

also die werte für die Farben füge ich mit

this.cd.Color.Name

in die datenbank ein.

Was kann ich unter Fallback/Default-Farbe verstehen?

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

jetzt bin ich soweit der Zelle eine Farbe zuzuweisen jedoch gibts folgendes Problem: Beim Generieren der Tabelle im DataGridview durch den Designer wird anscheinend das Design jedesmal von der Designervorgabe übernommen d.h. mit:

this.dgvRes[1, 0].Style.BackColor = Color.Blue;

kann ich an der Zellfarbe nix ausrichten, da der Designer mit seinem DataGridViewCellStyle{} jedesmal die Farbwerte überschreibt.

Wie kann ich das umgehen ohne in den Designer eingreifen zu müssen?

Greetz saio

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

oder kann es sein, dass ich das DataGridView komplett ohne Designer alleine aufbauen muss um das hinzukriegen?

Kann mir bitte jemand helfen?

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

H
91 Beiträge seit 2007
vor 16 Jahren

also Du erstellst im Designer nur die Sachen, die nicht dynamisch vom Inhalt abhängig sind. Die Hintergrundfarbe änderst Du IMO am besten in einem event-handler des DataGridView controls. Oben hast Du schon ein Beispiel für den RowsAdded - Event handler. Wie Du events empfängst und behandlest, lies Dir am besten in der msdn durch. Im Handler wertest Du den Inhalt der Zelle aus und setzt die Farbe. Wenn Du bei Deiner "Farbe als String" Technik bleiben willst, die Farben also als stiring aus der DB kommen, wandelst Du den Farbennamen in die Farbe mit Color.FromName(farbname) und setzt wie oben in meinem Beispiel die Farbe mittels der Style Eigenschaft. Bitte sieh es Dir oben noch mal an. Klappt es jetzt?

==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET

A
83 Beiträge seit 2007
vor 16 Jahren

Hallo saio,

such doch einfach mit Intellisense was Color... so anbietet.

Es gibt z.B. Color.Fromargb( i, i, i, )

oder Color.FromName( string )

damit müßte es gehen, Color.fromArgb hab ich selber schon benutzt, du brauchst aber 3 Integerwerte für rot, grün und blau.

Ups, habe den Thread noch mal genauer überflogen, meine Antwort hilft wahrscheinlich nicht viel,

kann ich an der Zellfarbe nix ausrichten, da der Designer mit seinem DataGridViewCellStyle{} jedesmal die Farbwerte überschreibt.

setzt du denn die Farbe auch, nachdem der Designer sie gesetzt hat?

hth, ara

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

Hallo,

danke für eure Antworten.

ara:
setzt du denn die Farbe auch, nachdem der Designer sie gesetzt hat?

ja mach ich aber nachdem ich die farben setze muss ich wieder mit:

this.resDateTabTableAdapter.Fill(this.pRP_MainDBDataSet.ResDateTab);

das DataGridView aktualisieren - wahrscheinlich überschreibt er mir dann meine Farbangaben mit der vorgegeben Zellformatierung aus den Eigenschaften des DataGridViewCellStyle{}

kann ich ihm irgendwie sagen, er soll den DataGridViewCellStyle{} nicht verwenden oder muss ich einen eigenen DataGridViewCellStyle{} erstellen und zuweisen?

@haymo

ich werd mir das mit den events jetzt mal durchlesen - vielleicht versteh ich dann deinen Lösungsansatz etwas besser

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

A
83 Beiträge seit 2007
vor 16 Jahren

Hallo saio,

kann ich ihm irgendwie sagen, er soll den DataGridViewCellStyle{} nicht verwenden oder muss ich einen eigenen DataGridViewCellStyle{} erstellen und zuweisen?

meines Wissens geht das nicht, du könnstest doch aber das ganze dgv in einer Schleife durchlaufen und die Farben setzen?

Zu den Events des dgv z.B. CellValueChanged, RowAdded usw. hatten wir hier schon einen ähnlichen Thread, sie werden wohl nicht für jede dgv-Row gefeuert wenn das dgv über ein dataset aktualisiert wird.

Grüße, ara

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren

hmm,
ich hab jetzt mit:

this.dgvRes[1, 0].Style.BackColor = Color.Blue;

einer Zelle die Farbe Blau zugewiesen das problem ist jetzt nur, dass die Farben erst übernommen werden nachdem die tabelle des datagridview gezeichnet hat.

wo muss ich dann den befehl einfügen?

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!

S
saio Themenstarter:in
85 Beiträge seit 2007
vor 16 Jahren
Beantwortet

Hallo,

erst einmal danke an euch alle für die Hilfe.
nach langem suchen bin ich zur Lösung gekommen indem ich einfach ein event benutze, welches nach jedem hinzufügen einer zeile gleich die Farbe setzt:

 private void dgvRes_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
        {
           this.dgvRes[1, e.RowIndex].Style.BackColor = Color.FromArgb(getCellColor(Convert.ToInt32(this.dgvRes[0, e.RowIndex].Value)));      
        }

Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!