Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Hintergrundfarbe in Zellen ändern [BEANTWORTET]
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

Hintergrundfarbe in Zellen ändern [BEANTWORTET]

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
Thorsten1983
myCSharp.de - Member



Dabei seit:
Beiträge: 149

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

beantworten | zitieren | melden

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:
Zitat
Fehler 1 Ungültige Umwandlung von System.String in System.Drawing.Color

Kann ich den Result vom DataReader, irgendwie einem Colorobjekt als Wert zuweisen?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von saio am .
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
private Nachricht | Beiträge des Benutzers
haymo
myCSharp.de - Member



Dabei seit:
Beiträge: 91
Herkunft: Berlin

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von haymo am .
==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
haymo
myCSharp.de - Member



Dabei seit:
Beiträge: 91
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

beantworten | zitieren | melden

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
Zitat
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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von saio am .
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
private Nachricht | Beiträge des Benutzers
haymo
myCSharp.de - Member



Dabei seit:
Beiträge: 91
Herkunft: Berlin

beantworten | zitieren | melden

Hast Du mal Color.FromName(bla) versucht?
==============================
heute schon numerics gehabt? Dann nichts wie
hin zu : ILNumerics.Net - numerics for .NET
private Nachricht | Beiträge des Benutzers
haymo
myCSharp.de - Member



Dabei seit:
Beiträge: 91
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von saio am .
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von saio am .
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

beantworten | zitieren | melden

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

Kann mir bitte jemand helfen?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von saio am .
Programmieren ist die Erstellung einer auf den Entwickler bezogenen Persönlichkeitsreflektion!
private Nachricht | Beiträge des Benutzers
haymo
myCSharp.de - Member



Dabei seit:
Beiträge: 91
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ara
myCSharp.de - Member



Dabei seit:
Beiträge: 83
Herkunft: Berlin

beantworten | zitieren | melden

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,
Zitat
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ara am .
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

beantworten | zitieren | melden

Hallo,

danke für eure Antworten.
Zitat
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!
private Nachricht | Beiträge des Benutzers
ara
myCSharp.de - Member



Dabei seit:
Beiträge: 83
Herkunft: Berlin

beantworten | zitieren | melden

Hallo saio,
Zitat
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
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
saio
myCSharp.de - Member



Dabei seit:
Beiträge: 85
Herkunft: Baden-Württemberg

Themenstarter:

Beantwortet

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers