Laden...

Text im DataGridView mit DrawString ändern

Erstellt von aloneboy vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.691 Views
A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren
Text im DataGridView mit DrawString ändern

Hallo zusammen,

stehe vor einem kleinen Problem und hoffe auf Hilfe.
ich fülle ein DataGridview folgendermaßen per Code

dataGridView1.Rows.Add(false, "RetourenNr.: " +Zusatztext);
            dataGridView1.Rows.Add(false, "RMA-Nr.: " +Zusattext);
            dataGridView1.Rows.Add(false, "Beleg: "+Zusatztext );

Nun möchte ich gerne, das z.B. RetourenNr,RMA-Nr und BelegNr anders dargestellt werden.

Bin dabei momentan so vorgegangen zum testen, der Text "Beleg" soll zu "TEST" geändert werden, doch leider ändert sich nichts und finde den Fehler nicht.
Selbst nur die Textfarbe bekomme ich so nicht hin. Nutze ich das falsche Event?



        private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {if (e.Value == null) return;
           
            if (e.Value != null) {
                
                if (e.Value.ToString().Contains("Beleg"))
                {
                    
                    
                    Font drawFont = new Font("Arial", 16);
                    SolidBrush drawBrush = new SolidBrush(Color.Green);

                    
                    Point drawPoint = new Point(e.CellBounds.X,e.CellBounds.Y);
                    //Point drawPoint = new Point(100, 50);
                    
                    
                    //e.Graphics.DrawString("test", drawFont, drawBrush, drawPoint);

                    e.Graphics.DrawString("TEST",e.CellStyle.Font,drawBrush,drawPoint  );
                }
            }
            else
                e.Handled = true;
        }
    

Danke für eure Hilfe

87 Beiträge seit 2016
vor 4 Jahren

Hallo,

du musst den Zeileninhalt der entsprechenden Spalte ändern.

Im allgemeinen sieht es etwas merkwürdig aus, was du da anstellst.

glandorf

A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren

Hallo Glandorf,

ich denke Mal das meine Idee, den Text zu ändern im Gedanken einfacher von statten geht, als es wirklich ist.
Kannst Du mir bitte sagen, wo ich den Text ändern kann und muss?

danke

87 Beiträge seit 2016
vor 4 Jahren

Hallo,

du suchst die DataGridViewCell.Value - Eigenschaft.

Warum bindest du nicht eine Datenquelle an das DataGridView? Das wäre die bessere Herangehensweise, als direkt in der DataGridView herumzuwursteln.

galndorf

A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren

ich kam per Zufall drauf etwas zu ändern und möchte jetzt eigentlich nur wissen wie ich es hinbekomme. Einfach mehr dazu lernen und für die Ersichtlichkeit im DGV ist es auch besser.

mein Gedanke war,

**Beleg: ** 5355727
oder
**RMA-Nr: ** 883645

aussehen zu lassen.
Bekommt man so ein Aussehen auch mit DataGridViewCell.Value hin?

Gruß

87 Beiträge seit 2016
vor 4 Jahren

Hallo,

2 Spalten würden diese Anforderung abdecken. Für die erste Spalte kann im DefaultCellStyle für den Font Bild auf true gestellt werden. Geht sogar alles über den Designer. Die entsprechende Hilfe zum DataGridView hilft dir hier weiter.

DataGridViewCell.Value ist nur der Wert und nicht die Formatierung. Steht auch in der Hilfe.

glandorf

A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren

der Text steht in einer Spalte, nur das in Vorab geschrieben wird worum es sich dabei handelt.

so wie im Anhang sieht es aus.
und möchte jetzt gerne, BelegNr, RMANr ect. in Bold dargestellt haben.
Daher dachte ich, wenn das Grid gezeichnet wird, ich es abfangen könnte wenn der Text geschrieben wird, ich ihn verändern kann. Wenn es eine einfachere Möglichkeit gibt, habe ich nichts dagegen. Möchte gerne dazulernen und die Idee von mir umsetzen.

4.939 Beiträge seit 2008
vor 4 Jahren

Da du ja laut deinem ersten Code den Text selberzusammenstellst, benutze dann doch, wie vorgeschlagen, 2 Spalten dafür.

Wenn du Text innerhalb einer Zelle verschiedenartig formatieren möchtest, dann mußt du sowieso jeden einzelnen Teilstring einzeln zeichnen. Oder willst du den gesamten-Spaltentext fett formatieren - und nicht nur z.B. den Teiltext "Beleg"?

Und zu deinem CellPainting-Code:

  • Hast du überhaupt das Ereignis (im Designer oder per Code) passend abonniert?
  • Benutze ansonsten den Debugger: [Artikel] Debugger: Wie verwende ich den von Visual Studio?
  • e.Handled mußt du nur dann auf true setzen, wenn du die weitere Abarbeitung des Ereignisses abbrechen möchtest (also wenn du selber zeichnest, nicht wie jetzt, andersherum)
  • Die Abfrage auf e.Value == null hast du doppelt drin.
  • lokale GDI-Objekte (wie Brush, Font etc. mußt du wieder freigeben, d.h. using-Anweisung benutzen, oder aber als Membervariable anlegen bzw. vorhandene Konstanten wie Brushes benutzen.

Edit: In Gewusst wie: Anpassen der Darstellung von Zellen im DataGridView-Steuerelement von Windows Forms gibt es passenden Beispielcode.

A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren

ja klar könnte man es so lösen, doch mein Gedanke war es, den Text vor dem schreiben direkt zu formatieren. Habe ehrlich gedacht es ginge etwas einfacher, aber nun gut bin ja kein Profi aber es hat mein Interesse geweckt und versuche es hin zu bekommen. Da ich es schon geschafft habe mit dieser Version Text zu schreiben( zwar nicht wie gewünscht), dachte ich mir, es ginge einfacher.

danke für die Infos und Beispielcodes, werde es mir ansehen und hoffe ich komme einen Schritt weiter

5.658 Beiträge seit 2006
vor 4 Jahren

mein Gedanke war...Habe ehrlich gedacht...dachte ich mir...und hoffe

Die erste Anlaufstelle ist immer die Doku, ob für Anfänger oder Profis: [Tipp] Schau in die Doku! - Möglichkeiten der Informationsgewinnung

Weeks of programming can save you hours of planning

A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren

Du das habe ich getan, aber wenn man nicht genau sagen kann, wonach man suchen muss, ist es schon nicht ganz so einfach. Ob Doku oder Googel macht es ohne erfahrene Tips nicht unbedingt leichter. Mit dem Link von Tj69 kam ich an ein sehr gutes Beispiel was mich bis jetzt sehr geholfen hat und ich ein ganz schönes Stück weiter gekommen bin.

Danke

A
aloneboy Themenstarter:in
27 Beiträge seit 2014
vor 4 Jahren

Habe bis auf ein kleines Problem hinbekommen und hoffe jemand kann mir helfen, komme einfach nicht weiter.


  private void Form1_Load(object sender, EventArgs e)
        {
            
            this.dataGridView1.DefaultCellStyle.WrapMode = DataGridViewTriState.True;

            dataGridView1.Rows.Add(false, "Kunde: ");


            dataGridView1.Rows.Add(false, "Service Auftrag: ");

            dataGridView1.Rows.Add(false, "Fabrikat: "+ "Ich schreibe hier mal ein paar Testworte um zu sehen wie es bei langen Sätzen so funktioniern wird.");
            

            dataGridView1.Rows.Add(false, "Typ: ");
            dataGridView1.Rows.Add(false, "S/N: ");

            dataGridView1.Rows.Add(false, "Zustand: ");
            dataGridView1.Rows.Add(false, "Zubehör: ");
            dataGridView1.Rows.Add(false, "Fehler: ");
            dataGridView1.Rows.Add(false, "Kaufdatum: ");
            dataGridView1.Rows.Add(false, "Artikel-Nr.: ");
            dataGridView1.Rows.Add(false, "Policen-Nr.: ");

            dataGridView1.Rows.Add(false, "RetourenNr.: ");
            dataGridView1.Rows.Add(false, "RMA-Nr.: ");
            dataGridView1.Rows.Add(false, "Beleg: " + "Ich schreibe hier mal ein paar Testworte um zu sehen wie es bei langen Sätzen so funktioniern wird.");

        }


        private void dataGridView1_CellPainting(object sender,System.Windows.Forms.DataGridViewCellPaintingEventArgs e)
        {
          
            if(e.Value!=null)
                    if (this.dataGridView1.Columns["Column2"].Index ==
                e.ColumnIndex && e.RowIndex >= 0)
            {
                   int start = 0;
                    int end = e.Value.ToString().IndexOf(":");
                    string teil = e.Value.ToString().Substring(start, end+1);
                    string teilende = e.Value.ToString().Substring(end +2);

                Rectangle newRect = new Rectangle(e.CellBounds.X + 1,
                    e.CellBounds.Y + 1, e.CellBounds.Width - 4,
                    e.CellBounds.Height -4);

                using (
                    Brush gridBrush = new SolidBrush(this.dataGridView1.GridColor),
                    backColorBrush = new SolidBrush(e.CellStyle.BackColor))
                {
                    using (Pen gridLinePen = new Pen(gridBrush))
                      {
                        // Erase the cell.
                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                        // Draw the grid lines (only the right and bottom lines;
                        // DataGridView takes care of the others).
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                            e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,
                            e.CellBounds.Bottom - 1);
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
                            e.CellBounds.Top, e.CellBounds.Right - 1,
                            e.CellBounds.Bottom);

                        // Draw the inset highlight box.
                        e.Graphics.DrawRectangle(Pens.Blue, newRect);

                        // Draw the text content of the cell, ignoring alignment.
                        //if (e.Value != null)
                        //{


                                e.Graphics.DrawString(teil, new Font(e.CellStyle.Font, FontStyle.Bold),
                               Brushes.Black, e.CellBounds.X + 2,
                               e.CellBounds.Y + 2, StringFormat.GenericDefault);

                              
                              SizeF  pos = new SizeF(e.Graphics.MeasureString(teil, new Font(e.CellStyle.Font, FontStyle.Bold)));

                              RectangleF  newRectnew = new RectangleF(e.CellBounds.X+pos.Width,e.CellBounds.Y+2,newRect.Width-pos.Width,newRect.Height);

                                                            
                                e.Graphics.DrawString(teilende, new Font(e.CellStyle.Font, FontStyle.Regular),
                              Brushes.Black, newRectnew, StringFormat.GenericDefault);
                               
                            //}

                            e.Handled = true;
                      }
                }

                     }
        }

die letzten Worte werden immer abgeschnitten und nicht dargestellt, finde allerdings keinen Fehler bzw. eine Lösung.

5.658 Beiträge seit 2006
vor 4 Jahren

Was genau wird nicht dargestellt? Text, der nicht in die Spalte paßt?

Ansonsten würde man dafür kaum ein DataGrid verwenden, du siehst ja selbst, wie unübersichtlich das wird, wenn man alles selbst zeichnen muß. Windows Forms hat nämlich noch andere Steuerelemente, nicht nur das DGV 😃

Weeks of programming can save you hours of planning