Discussion:
DataGridView, ändern des FontStyle
(zu alt für eine Antwort)
Maximilian Tescher
2009-08-01 22:50:07 UTC
Permalink
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
2009-08-02 08:42:49 UTC
Permalink
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
Maximilian Tescher
2009-08-02 09:02:58 UTC
Permalink
Hallo,
sorry, aber die Frage hat sich erledigt, man sollte die Onlinhilfe
besser lesen.

Gruss,
Maxi
Peter Götz
2009-08-02 08:47:01 UTC
Permalink
Hallo Maximilian,
Post by Maximilian Tescher
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?
Post by Maximilian Tescher
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
2009-08-02 09:02:18 UTC
Permalink
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
Peter Götz
2009-08-02 16:55:51 UTC
Permalink
Hallo Maximilian,
Post by Maximilian Tescher
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.
Post by Maximilian Tescher
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.
Post by Maximilian Tescher
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.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Maximilian Tescher
2009-08-03 15:14:37 UTC
Permalink
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
2009-08-03 16:13:53 UTC
Permalink
Hallo Maximilian,
Post by Maximilian Tescher
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.
Post by Maximilian Tescher
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.
Post by Maximilian Tescher
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.
Post by Maximilian Tescher
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.
Post by Maximilian Tescher
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.
Post by Maximilian Tescher
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
Post by Maximilian Tescher
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.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Maximilian Tescher
2009-08-03 20:27:09 UTC
Permalink
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
2009-08-04 06:26:28 UTC
Permalink
Hallo Maximilian,
Post by Maximilian Tescher
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.

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

Loading...