Benutzer mit den meisten Antworten
DataGridView - CellValidating - Lösungsansätze - CurrentCell.FormattedValue

Frage
-
Hallo,
ich darf den Wert verkleinern, nicht vergrößern. Hab's so gelöst.
private void dGVMaterial_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { if (dGVMaterial.Columns[e.ColumnIndex].Name == "quantity") { if (dGVMaterial.CurrentCell.RowIndex == 0 && dGVMaterial.CurrentCell.OwningColumn.Name == "quantity") { string isBe = dGVMaterial.CurrentCell.FormattedValue.ToString(); string newValue = e.FormattedValue.ToString(); Int32 intIsBe = 0; Int32 intNewValue = 0; try { intIsBe = Convert.ToInt32(isBe); intNewValue = Convert.ToInt32(newValue); if (intNewValue <= intIsBe) dGVMaterial.Rows[e.RowIndex].ErrorText = ""; else throw (new FormatException("PUnklar ist
Mal so mal so, gibt es irgendwo eine grafische!! Übersicht, was was ist ?!?if (dGVMaterial.Columns[e.ColumnIndex].Name == "quantity")
{
if (dGVMaterial.CurrentCell.RowIndex == 0 && dGVMaterial.CurrentCell.OwningColumn.Name == "quantity")
{Spalte spreche ich so an?
this.quantity.DataPropertyName = "Quantity";Zelle spreche ich so an?
this.quantity.Name = "quantity";Eigentlich uninteressant ? HeaderText; User mehr nicht, korrekt?
Grüße Andreas
Antworten
-
Hallo Andreas,
- DataPropertyName, Name, HeaderText ... Wie spricht man nun was an?
die (geeigntste) zu wählende Methode bzw. Eigenschaft unterscheidet sich, je nach Bindung der Daten an das DataGridView.
Es kann sein, dass das Grid gar nicht über einen DataSource gebunden ist, dann scheidet bspw. DataPropertyName aus.
Es kann auch sein, dass die Name-Eigenschaft leer ist. Zum Teil kann auch mal eine DisplayIndex-Eigenschaft zu wählen sein.Wichtig ist, dass man versucht, die Wahl der Eigenschaft so typsicher wie möglich zu machen. In Deinem Fall arbeitest Du bspw. mit Strings, wo man sich auch leicht mal verschreiben kann. Bei typsicheren DataSets/DataTables bspw. kann man den ColumnName über das Schema abfragen und arbeitet ohne manuell eingegebene Strings. Man kann sich auch eine Klasse bauen, die die Namen als statische öffentliche Konstanten-Strings hält. Der Vorteil ist (und sollte sein), dass bei Änderungen in Datenquellen-Klassen ggf. automatisch die erweiterten/geänderten Stellen schon durch den Compiler markiert werden und, dass man schneller und fehlerfreier die Namen (ggf. mit Intellisense) auswählen kann. Nun, trotzdem hat alles Vor- und Nachteile, die goldene (immer anwendbare) Lösung gibt es da nicht.
Zur Technik der Validierung ggf. noch Bei Bedarf mit "e.Cancel = true" und der ErrorText-Eigenschaft arbeiten.[Exemplarische Vorgehensweise: Validieren von Daten im DataGridView-Steuerelement in Windows Forms]
http://msdn.microsoft.com/de-de/library/ykdxa0bc.aspxWas auch zum Teil unbekannt ist, dass man in seinen Businessobjekten
IDataErrorInfo
[->Beispiel, sonst oft nur aus WPF/Silverlight bekannt] implementieren kann, und dann den BindingSource als DataSource für einen eigenen ErrorProvider nutzen kann. Auf diesem Weg können die Businessobjekte selber die Validierung übernehmen und das Grid zeigt Validierungsfehler automatisch an. In Deinem Fall wolltest Du ja eine "größer/kleiner - Prüfung", die dann bspw. über das RangeAttribute geregelt werden könnte.
ciao Frank
- Als Antwort markiert Andreas Bauer2 Mittwoch, 27. Juli 2011 07:02
Alle Antworten
-
könntest Du die Frage etwas genauer stellen?
Hallo Frank,
ja kein Problem.
A)
Bei einem DataGridView gilt es für eine Zelle eine Überprüfung zu machen.
A1 Neuer Wert <= Alter Wert --> IO
A2 Neuer Wert > Alter Wert --> NIO
Am besten dann eine Meldungsausgabe.
Ich habe es wie oben gelöst, bin jedoch nicht sicher, ob gut.
B)
Das DataGridView hat ja viele Eigenschaften, oft ist es ja, verbiegen kann man alles, wie ansprechen.
Es liegen folgende Namen vor.
- DataPropertyName
- Name
- HeaderText
Wie spricht man nun was an? Einfach ein Übersichtsbild. Man sucht halt relativ lange bis man ans Ziel kommt.
Oder anders gesagt Unterschied DataPropertyName zu Name...
Am besten ist doch immer gezielt mit Name ansprechen, so ist man los gelöst vom Index.
OK?
Grüße Andreas
-
Hallo Andreas,
- DataPropertyName, Name, HeaderText ... Wie spricht man nun was an?
die (geeigntste) zu wählende Methode bzw. Eigenschaft unterscheidet sich, je nach Bindung der Daten an das DataGridView.
Es kann sein, dass das Grid gar nicht über einen DataSource gebunden ist, dann scheidet bspw. DataPropertyName aus.
Es kann auch sein, dass die Name-Eigenschaft leer ist. Zum Teil kann auch mal eine DisplayIndex-Eigenschaft zu wählen sein.Wichtig ist, dass man versucht, die Wahl der Eigenschaft so typsicher wie möglich zu machen. In Deinem Fall arbeitest Du bspw. mit Strings, wo man sich auch leicht mal verschreiben kann. Bei typsicheren DataSets/DataTables bspw. kann man den ColumnName über das Schema abfragen und arbeitet ohne manuell eingegebene Strings. Man kann sich auch eine Klasse bauen, die die Namen als statische öffentliche Konstanten-Strings hält. Der Vorteil ist (und sollte sein), dass bei Änderungen in Datenquellen-Klassen ggf. automatisch die erweiterten/geänderten Stellen schon durch den Compiler markiert werden und, dass man schneller und fehlerfreier die Namen (ggf. mit Intellisense) auswählen kann. Nun, trotzdem hat alles Vor- und Nachteile, die goldene (immer anwendbare) Lösung gibt es da nicht.
Zur Technik der Validierung ggf. noch Bei Bedarf mit "e.Cancel = true" und der ErrorText-Eigenschaft arbeiten.[Exemplarische Vorgehensweise: Validieren von Daten im DataGridView-Steuerelement in Windows Forms]
http://msdn.microsoft.com/de-de/library/ykdxa0bc.aspxWas auch zum Teil unbekannt ist, dass man in seinen Businessobjekten
IDataErrorInfo
[->Beispiel, sonst oft nur aus WPF/Silverlight bekannt] implementieren kann, und dann den BindingSource als DataSource für einen eigenen ErrorProvider nutzen kann. Auf diesem Weg können die Businessobjekte selber die Validierung übernehmen und das Grid zeigt Validierungsfehler automatisch an. In Deinem Fall wolltest Du ja eine "größer/kleiner - Prüfung", die dann bspw. über das RangeAttribute geregelt werden könnte.
ciao Frank
- Als Antwort markiert Andreas Bauer2 Mittwoch, 27. Juli 2011 07:02