none
Probleme mit Hintergrundfarbe in Datagridview und nicht gebundener Checkbox RRS feed

  • Frage

  • Ich versuche mein erstes Projekt mit c#/.net zu entwickeln. Leider hänge ich schon wieder mit einem Problem:

    Ich habe ein Datagrid Lieferanten, welches ich aus dem Datenmodell erstellt habe und die Spalten die ich nicht benötigt habe, gelöscht habe. Als erste Spalte habe ich eine nicht gebundene Checkbox hinzugefügt, mit der ich Lieferanten für eine Anfrage auswähle oder deaktiviere. Ich habe diesen Weg gewählt weil es derzeit nur 12 Lieferanten gibt die dieses Produkt liefern können.

    Erstellen einer Anfrage an die ausgewählten Lieferanten:

    Ein Lieferant kann eine Liefersperre haben, dann soll die Zeile dieses Lieferanten rot  und  die Checkbox (1. Spalte) deaktiviert sein, alle anderen Lieferanten sind aktiviert und in normaler Farbe.

    // Einlesen der Lieferanten in DataGridView

    var queryLif = context.Lieferanten

       .OrderBy(l=>l.Firma).ToList();

    lieferantBindingSource.DataSource = queryLif;

     

     

    for (int row = 0; row < lieferantDataGridView.Rows.Count; row++)

    // Durchlaufe alle Zeilen des Gridviews (Lieferanten)

    {

    // Suche die Spalte mit dem Wert Liefersperre

        for (int i = 0; i < lieferantDataGridView.Rows[row].Cells.Count; i++)

        {

            string x = lieferantDataGridView[i,row].OwningColumn.DataPropertyName.ToString();

            if (x == "Liefersperre")

            {

    // Ist die Zelle Liefersperre true == Liefersperre, setze rote Hintergrundfarbe für die Zeile (Lieferant)

               if (lieferantDataGridView[i, row].Value.Equals(true))

               {

                  for (int col = 0; col < lieferantDataGridView.Rows[row].Cells.Count; col++)

                  {

                      lieferantDataGridView[col,row].Style.BackColor = Color.Red;

                  }

    // und setze Auswahl des Lieferanten (1.Spalte) auf false

                  lieferantDataGridView[0, row].Value = false;

                }

                else

                {

    // wenn keine Liefersperre, verändere Hintergrundfarbe nicht und setze  Lieferanten auf 'ausgewählt' (1.Spalte)

                    lieferantDataGridView[0, row].Value = true;

                }

            }

        }

    }

    Das Ganze hat schon funktioniert, das einzige was ich geänderte habe, ich habe als Startfenster ein übergeordnetes MDI Fenster verwendet, vorher hatte ich nur ein normales Windows Form Fenster in das ich eine Menüleiste eingefügt hatte.

    Hier der Aufruf des Formulars aus einem andern Form mit Menüleiste, hier werden gesperrte Lieferanten korrekt in Rot angezeigt.

            private void anfrageErstellenToolStripMenuItem_Click(object sender, EventArgs e)
            {
                dtaBlitzAnfrage bli = new dtaBlitzAnfrage();
                bli.Show();
            }

    Hier der Aufruf des Formulars aus einem Übergeordneten MDI Formulars. Gesperrte Lieferanten werden nicht in Rot angezeigt, Code wird aber durchlaufen. Ebenso bleiben alle Auswahl-Checkboxen deselektiert.

            private void blitzanfrageErstellenToolStripMenuItem_Click(object sender, EventArgs e)
            {
                dtaBlitzAnfrage bli = new dtaBlitzAnfrage();
                bli.MdiParent = this;
                bli.Show();

            }

    Ich hoffe dass ich mich verständlich ausgedrückt habe und würde mich über eine Hilfe freuen.

    Siegfried


    Freitag, 6. April 2012 22:37

Antworten

  • Hallo Siegfried,

    habe deinen Code testweise in Visual Basic nachvollzogen. Das gleiche Ergebnis wie bei dir. Bei Aufruf vom Nicht-MDI Form erschien Rot in den entsprechenden Zeilen als Hintergrundfarbe. Bei Aufruf von einem MDI - Form nicht.

    Und zwar dann wenn beim Form mit dem DataGridView das Setzen der Hintergrundfarbe im Form_Load Event geschah. Sobald ich diesen Code in das Form_Shown oder das Form_Activated Event verlagerte funktionierte es.

    Es scheint so zu sein das bei einem MDIChild Form Controleigenschaften die die Hintergrundfarbe betreffen und andere erst nach dem Form_Load Event gesetzt werden. Das Verhalten unterscheidet sich wie es aussieht von einem Nicht MDIChild Form.

    Grüße
    Markus



    Samstag, 7. April 2012 14:27

Alle Antworten

  • Hallo Siegfried,

    habe deinen Code testweise in Visual Basic nachvollzogen. Das gleiche Ergebnis wie bei dir. Bei Aufruf vom Nicht-MDI Form erschien Rot in den entsprechenden Zeilen als Hintergrundfarbe. Bei Aufruf von einem MDI - Form nicht.

    Und zwar dann wenn beim Form mit dem DataGridView das Setzen der Hintergrundfarbe im Form_Load Event geschah. Sobald ich diesen Code in das Form_Shown oder das Form_Activated Event verlagerte funktionierte es.

    Es scheint so zu sein das bei einem MDIChild Form Controleigenschaften die die Hintergrundfarbe betreffen und andere erst nach dem Form_Load Event gesetzt werden. Das Verhalten unterscheidet sich wie es aussieht von einem Nicht MDIChild Form.

    Grüße
    Markus



    Samstag, 7. April 2012 14:27
  • Danke Markus, das hat mir sehr geholfen.

    Siegfried

    Samstag, 7. April 2012 16:45
  • Hallo Siegfried,

    es empfiehlt sich die Anzeigen von Zellen im CellFormatting Ereignis anzupassen,
    siehe auch Gewusst wie: Anpassen der Datenformatierung im DataGridView-Steuerelement in Windows Forms

    Und es ist effizienter nicht jeder Zeile einen Stil zuzuweisen wird, siehe dazu auch den Abschnitt in
    Effiziente Verwendung von Zellstilen

    Und womöglich entschwindet das Problem der Anzeige ebenso.

    Gruß Elmar

    Montag, 9. April 2012 16:46
    Beantworter