Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

DataGridView, ändern des FontStyle

442 views
Skip to first unread message

Maximilian Tescher

unread,
Aug 1, 2009, 6:50:07 PM8/1/09
to
Hallo,

kleine Frage zum DataGridView.

Ich gehe jeweils alle Einträge des DataGridView durch und möchte bei
bestimmten Zellen die Schrift ändern auf FontStyle.Bold.

Geschafft habe ich es, nur dann ist die Schrift dermassen klein das
ich den Text nicht mehr lesen kann.

Wenn ich die Zellen anspreche mit DGV.item("Name", zeile)..., wie kann
ich beim Durchgehen der Tabelle den Style setzen?

Viele Grüsse,
Maxi

Maximilian Tescher

unread,
Aug 2, 2009, 4:42:49 AM8/2/09
to
Weitere Frage zu diesem Thema, kann man ausser dem zuweisen des Error-
Text per Zeile das gleiche auch per Zelle machen?
Also statt DGV.rows(x).ErrorText das ganze für jede Zelle?

Gruss,
Maxi

Peter G�tz

unread,
Aug 2, 2009, 4:47:01 AM8/2/09
to
Hallo Maximilian,

> kleine Frage zum DataGridView.
>
> Ich gehe jeweils alle Eintr�ge des DataGridView durch
> und m�chte bei bestimmten Zellen die Schrift �ndern auf


> FontStyle.Bold.
>
> Geschafft habe ich es, nur dann ist die Schrift dermassen
> klein das ich den Text nicht mehr lesen kann.

Wie (Code) hast Du denn das geschafft?

> Wenn ich die Zellen anspreche mit DGV.item("Name", zeile)...,
> wie kann ich beim Durchgehen der Tabelle den Style setzen?

Schau Dir mal

www.gssg.de -> Visual Basic -> VB.net
-> DataGridView CellFormat

an. Das sollte genau Dein Problem treffen.

Gru� aus St.Georgen
Peter G�tz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)


Maximilian Tescher

unread,
Aug 2, 2009, 5:02:18 AM8/2/09
to
Hallo Peter,

ich hatte mir das das Beispiel angesehen, nur da ich die Überprüfung
der Zellinhalte an einer anderen Stelle vornehme, möchte ich es dort
soweit formatieren. In Deinem Beispiel geht das über die Funktion wenn
die Zelle formatiert werden soll, nur wie kann man das Zuweisen von
Styles auch ausseralb lösen?

Anhand Deinem Beispiel habe ich das ganze in meiner Prozedure
versucht, konnte auch den gewünschten Style ohne Fehler zuweisen, aber
es wird nicht ausgeführt :-(

Geht das nur so wie in Deinem Beispiel?


Gruss,
Maxi

Maximilian Tescher

unread,
Aug 2, 2009, 5:02:58 AM8/2/09
to
Hallo,
sorry, aber die Frage hat sich erledigt, man sollte die Onlinhilfe
besser lesen.

Gruss,
Maxi

Peter G�tz

unread,
Aug 2, 2009, 12:55:51 PM8/2/09
to
Hallo Maximilian,

> ich hatte mir das das Beispiel angesehen, nur da ich

> die �berpr�fung der Zellinhalte an einer anderen Stelle
> vornehme, m�chte ich es dort soweit formatieren. In
> Deinem Beispiel geht das �ber die Funktion wenn


> die Zelle formatiert werden soll, nur wie kann man

> das Zuweisen von Styles auch ausseralb l�sen?

Ob Du einer DGV-Zelle einen Style aus der
Sub _CellFormatting() oder aus irgendeiner anderen
Prozedur heraus zuweist, ist erst mal ziemlich egal.

> Anhand Deinem Beispiel habe ich das ganze in meiner

> Prozedure versucht, konnte auch den gew�nschten Style
> ohne Fehler zuweisen, aber es wird nicht ausgef�hrt :-(

Na, da hast Du wohl meinen Code (teilweise) abgekupfert,
aber (noch) nicht wirklich verstanden.

> Geht das nur so wie in Deinem Beispiel?

Nein, das Zuwesien eines Style geht, wie schon erw�hnt,
von jeder beliebigen Prozedur aus.

Hier mal ein anderes Beispiel, bei dem mit Hilfe
eines Timers den Zellen der Spalte 1 Zeile f�r
Zeile ein anderer Style zugewiesen wird.

' /// Code in einer leeren Form1.vb
Public Class Form1
Private WithEvents DGV As DataGridView
Private WithEvents mT As Windows.Forms.Timer
Private mDT As DataTable
Private mDV As DataView
Private mFlag As Boolean
Private mEStyle As DataGridViewCellStyle
Private mRowIndex As Integer

Private Sub Form1_FormClosing _
(ByVal sender As Object, _
ByVal e As FormClosingEventArgs _
) Handles Me.FormClosing

mT.Stop()
mT.Dispose()
End Sub

Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

DGV = New DataGridView
With DGV
.DefaultCellStyle.Font = _
New Font("Arial", 12)

.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)

.Dock = DockStyle.Fill
End With
Me.Controls.Add(DGV)

CreateData()

DGV.DataSource = mDV
DGV.AutoResizeColumns()

mEStyle = New DataGridViewCellStyle

With mEStyle
.Font = _
New Font _
("Arial", 12, _
FontStyle.Bold Or _
FontStyle.Italic)

.BackColor = Color.Red
.ForeColor = Color.Yellow
End With

mT = New Windows.Forms.Timer
With mT
.Interval = 500
.Start()
End With
End Sub

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow

mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Text", GetType(String))

For i = 1 To 12
DR = .NewRow
DR.Item(0) = i
DR.Item(1) = MonthName(i, False)
.Rows.Add(DR)
Next
.AcceptChanges()
End With

mDV = New DataView(mDT)
End Sub


Private Sub mT_Tick _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mT.Tick


Dim R As DataGridViewRow
R = DGV.Rows(mRowIndex)

If DGV.Rows(mRowIndex).Cells(1).Style.Equals _
(DGV.Rows(mRowIndex).DefaultCellStyle) Then

R.Cells(1).Style = mEStyle
Else
R.Cells(1).Style = _
DGV.Rows(mRowIndex).DefaultCellStyle
End If

mRowIndex += 1
If mRowIndex > 11 Then
mRowIndex = 0
End If
End Sub
End Class
' \\\ E N T E

Im vorstehenden Beispiel erfolgt das Zuweisen des CellStyles
in der Sub mT_Tick(). Das k�nnte aber auch irgendeine andere
Prozedur sein.

Maximilian Tescher

unread,
Aug 3, 2009, 11:14:37 AM8/3/09
to
Hallo Peter,

ich bin gerade am überlegen, ob es nicht sinnvoller wäre alle
Änderungen im DataGridView in eine sub bzw die die Routine eines
Ereignises des DataGridView zu vereinen.

Folgendes muss ich machen:
In Spalte 1 und 2 kann der Anwender die Einträge ändern, um dann
prüfen zu können ob es eine Änderung gab, habe ich beide Spalten zu
Beginn nochmals in nicht sichtbare Spalten abgelegt. Ist keine
Änderung erfolgt, bleibt die Schrift normal, wurde eine Änderung
festgestellt, möchte ich die Inhalt in Fettschrift (also Bold)
formatieren.

Die dritte Spalte ist leer, hier wird nur der Hintergrund in grün
eingefärbt wenn die Daten in Zelle 2 ok sind, andernfalls in rot.

Die vierte Spalte ist wie die dritte Spalte, nur hier wird noch die
Länge der ersten Spalte (Anzahl Zeichen) ausgegeben.

Da ich stets den Inhalt des DataGridView (bzw die dahinter liegende
DataTable) prüfe, sind die Werte ja zu jeder Zeit verfügbar. Also
liegt nun die Idee nahe, doch alles in eine Prozedure resp. Ereignis
abzulegen.

Ist das so sinnvoll? Es würde thematisch ja eigentlich nahe liegen
alles was an der DataGridView gemacht wird in eine Funktion abzulegen.

Weiter stellt sich die Frage, wie kann ich abfangen das der Anwender
keine leeren Eingaben macht bzw den Zelleninhalt löscht und dann
nichts mehr eingibt?

Ist es weiter möglich wenn ich ErrorText pro Zelle ausgebe, über die
F2-Taste (als Beispiel) eine MessageBox aufzublenden und den näheren
Inhalt der Meldung auszugeben?

Da ich bis jetzt mehr oder weniger am experimentieren war, möchte ich
jetzt meine korrekte Version ohne "Schrott" nochmals schreiben, daher
die auch die Fragen :-)


Vielen Dank erst mal für Eure Unterstützung, hat mich doch schon mal
ein grosses Stück weiter gebracht :-))


Gruss,
Maxi

Peter G�tz

unread,
Aug 3, 2009, 12:13:53 PM8/3/09
to
Hallo Maximilian,

> ich bin gerade am �berlegen, ob es nicht sinnvoller
> w�re alle �nderungen im DataGridView in eine sub


> bzw die die Routine eines Ereignises des
> DataGridView zu vereinen.

Ich verstehe nicht so recht, welche "�nderungen im DGV"
Du in irgendeiner Sub vereinen m�chtest, bzw, wie das
konkret aussehen soll.

Ich denke Du bist �berhaupt zu sehr auf die Ereignisse
des DGV fixiert. �nderungen schlagen sich letztlich in
der DataView bzw. der zugeh�rigen DataTable, an
welches das DGV gebunden ist, nieder und genau
dort kannst Du auch recht einfach feststellen, ob ein
Datensatz ge�ndert, hinzugef�gt oder gel�scht worden
ist.

Schau Dir dazu mal das Beispiel unter

www.gssg.de -> Visual Basic -> VB.net

-> DataTable / DataView, RowState

an. In der Sub optView_Click() dieses Beispiels wird
ermittelt welche Datens�tze neu, ge�ndert oder gel�scht
sind.

> Folgendes muss ich machen:
> In Spalte 1 und 2 kann der Anwender die Eintr�ge �ndern,
> um dann pr�fen zu k�nnen ob es eine �nderung gab,


> habe ich beide Spalten zu Beginn nochmals in nicht
> sichtbare Spalten abgelegt.

Das ist v�llig �berfl�ssig. Ob ein Datensatz im Original-
zustand, neu, ge�ndert oder gel�scht ist, kannst Du an
dessen RowState feststellen (s.oben).

Dar�berhinaus kannst Du per

Dim X as Object
X = DataTable.Rows(x).Item(y, DataRRowVersion.Original)

jederzeit, also auch nach einer �nderung dieses Datensatzes
den urspr�nglichen Originalwert dieses Datensatzfeldes
auslesen.


> Ist keine �nderung erfolgt, bleibt die Schrift normal, wurde
> eine �nderung festgestellt, m�chte ich die Inhalt in Fettschrift
> (also Bold) formatieren.
>
> Die dritte Spalte ist leer, hier wird nur der Hintergrund in gr�n
> eingef�rbt wenn die Daten in Zelle 2 ok sind, andernfalls in rot.


>
> Die vierte Spalte ist wie die dritte Spalte, nur hier wird noch die

> L�nge der ersten Spalte (Anzahl Zeichen) ausgegeben.


>
> Da ich stets den Inhalt des DataGridView (bzw die dahinter

> liegende DataTable) pr�fe, sind die Werte ja zu jeder Zeit
> verf�gbar.

Mit

DataTable.Rows(x).Item(y, DataRowVersion.....)

kannst Du auf 4 f�r das jeweilige Feld gespeicherte Werte
zur�ckgreifen; n�mlich

DataRowVersion.Current
DataRowVersion.Default
DataRowVersion.Original
DataRowVersion.Proposed

Mehr dazu findest Du in der Online-Hilfe.

> Also liegt nun die Idee nahe, doch alles in eine Prozedure
> resp. Ereignis abzulegen.
>

> Ist das so sinnvoll? Es w�rde thematisch ja eigentlich nahe


> liegen alles was an der DataGridView gemacht wird in eine
> Funktion abzulegen.

So ganz verstehe ich Dein Vorhaben noch nicht und w�rde
deshalb nochmals vorschlagen, dass Du Dir das o.g. Beispiel

www.gssg.de -> Visual Basic -> VB.net

-> DataTable / DataView, RowState

mal eingehend ansiehst. Ich denke, das wird dann ohnehin
die meisten Deiner Fragen kl�ren.


> Weiter stellt sich die Frage, wie kann ich abfangen das der
> Anwender keine leeren Eingaben macht bzw den Zelleninhalt

> l�scht und dann nichts mehr eingibt?

Daf�r gibt es die Ereignisprozeduren

DGV_CellValidating
DGV_RowValidating
DGV_Validating

In diesen Ereignisprozeduren kannst Du die vom Benutzer
gemachten �nderungen �berpr�fen und bei Bedarf per
e.Cancel r�ckg�ngig machen bzw. unterbinden.


> Ist es weiter m�glich wenn ich ErrorText pro Zelle ausgebe,
> �ber die F2-Taste (als Beispiel) eine MessageBox
> aufzublenden und den n�heren Inhalt der Meldung auszugeben?

DataGridViewRow.ErrorText kannst Du nach Lust und Laune
auslesen und nat�rlich auch per MsgBox dem Anwender
zeigen. Wo siehst Du dabei ein Problem?

Ansonsten noch der Hinweis auf das Beispiel

www.gssg.de -> Visual Basic -> VB.net

-> DataGridView RowError


> Da ich bis jetzt mehr oder weniger am experimentieren war,

> m�chte ich jetzt meine korrekte Version ohne "Schrott"


> nochmals schreiben, daher die auch die Fragen :-)

Das DataGridView zusammen mit DataTable, DataView und
dem CurrencyManager bietet eine Vielzahl an M�glichkeiten.
Es ist deshalb schwer, eine ganz bestimmte Vorgehensweise
f�r irgendeine, nicht sehr genau umrissene Aufgabenstellung
vorzuschlagen.

Die Beispiele zum DataGridView sowie zu DataTable /
DataView unter

www.gssg.de -> Visual Basic -> VB.net

sollten jedoch reichlich Anregungen liefern.

Maximilian Tescher

unread,
Aug 3, 2009, 4:27:09 PM8/3/09
to
Ui Peter, mir raucht der Kopf, und vor allem scheint das DGV etrem
viele Möglichkeiten bereit zu halten. Ich schaue mir das mal an, hoffe
aber da ich nicht gleich überfordert bin:-)

Jetzt weiss ich das ich nichts weis :-) Ist ja irre ...

Gruss,
Maxi

Peter G�tz

unread,
Aug 4, 2009, 2:26:28 AM8/4/09
to
Hallo Maximilian,

> Ui Peter, mir raucht der Kopf, und vor allem scheint

> das DGV etrem viele M�glichkeiten bereit zu halten.


> Ich schaue mir das mal an, hoffe aber da ich nicht

> gleich �berfordert bin:-)

Die genannten Beispiele sind direkt im Code recht
ausf�hrlich kommentiert. Ich denke, das sollte schon
ganz gut nachvollziehbar sein.

Viel Spass dabei.

0 new messages