Laden...

DataGridView Zelle Format Error

Erstellt von zerberos vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.723 Views
Z
zerberos Themenstarter:in
520 Beiträge seit 2007
vor 15 Jahren
DataGridView Zelle Format Error

Hallo,

ich habe ein DataGirdView. Die Zellen haben folgendes Format:

System.Type.GetType("System.Double")

In den Zellen stehen also Zahlen drinnen. Jetzt hab ich aber das Problem das der User auch den Inhalt wieder löschen darf. Und wenn dann nichts drinnen steht, dann wirft der einen Error beim Verlassen der Zelle

Wie kann ich das Lösen das es auch möglich ist nichts einzugeben, bzw den Inhalt zu löschen das nichts drinnen steht

System.FormatException: Die Eingabezeichenfolge hat das falsche Format. ---> System.FormatException: Die Eingabezeichenfolge hat das falsche Format.
bei System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
bei System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
bei System.Double.Parse(String s, NumberStyles style, NumberFormatInfo info)
bei System.Double.Parse(String s, NumberStyles style, IFormatProvider provider)
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.Windows.Forms.Formatter.InvokeStringParseMethod(Object value, Type targetType, IFormatProvider formatInfo)
bei System.Windows.Forms.Formatter.ParseObjectInternal(Object value, Type targetType, Type sourceType, TypeConverter targetConverter, TypeConverter sourceConverter, IFormatProvider formatInfo, Object formattedNullValue)
bei System.Windows.Forms.Formatter.ParseObject(Object value, Type targetType, Type sourceType, TypeConverter targetConverter, TypeConverter sourceConverter, IFormatProvider formatInfo, Object formattedNullValue, Object dataSourceNullValue)
bei System.Windows.Forms.DataGridViewCell.ParseFormattedValueInternal(Type valueType, Object formattedValue, DataGridViewCellStyle cellStyle, TypeConverter formattedValueTypeConverter, TypeConverter valueTypeConverter)
bei System.Windows.Forms.DataGridViewCell.ParseFormattedValue(Object formattedValue, DataGridViewCellStyle cellStyle, TypeConverter formattedValueTypeConverter, TypeConverter valueTypeConverter)
bei System.Windows.Forms.DataGridView.PushFormattedValue(DataGridViewCell& dataGridViewCurrentCell, Object formattedValue, Exception& exception)

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo zerberos,

Du kannst hier das DataGridView.CellValidating Event benutzen, um den Inhalt zu überprüfen. Da das für jede Zelle es DGV ausgelöst werden kann, musst Du lediglich überprüfen um was für eine Zelle es sich handelt, und kannst dann spezifische Validierunsimplementierungen vornehmen.

Siehe auch hier:
MSDN - DataGridView.CellValidating Ereignis

Normalerweise hätte ich gesagt, schau in die Doku, was die DGV Klasse für Member hat, aber hier wird man ja erschlagen, deshalb der Tipp von mir

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Z
zerberos Themenstarter:in
520 Beiträge seit 2007
vor 15 Jahren

Hallo,

hab probiert das beim CellValidating zu lösen.

Aber anscheind bin ich irgendwie aufm Holzweg

LAs erstes Hab ich versucht die Fehlermeldung auszustellen einfach. Hat nicht geklappt. Als zweiten Ansatz hab ich Probiert wenn nen leerstring drinnen steht den Inhalt des Feldes einfach auf System.DBNull zu stellen. Akzeptiert der auch nicht

Hier mein Code. Wäre für nen Tipp echt dankbar

 this.DGV_Eingabe.Rows(e.RowIndex).ErrorText = "";
    
    if (DGV_Eingabe.Columns(e.ColumnIndex).ValueType.Name == "Double") {
        
        if ((!object.ReferenceEquals(DGV_Eingabe.Rows(e.RowIndex).Cells(e.ColumnIndex).Value, System.DBNull.Value))) {
            if (string.IsNullOrEmpty(e.FormattedValue)) {
                DGV_Eingabe.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = System.DBNull.Value;
            }
        }
    }
4.506 Beiträge seit 2004
vor 15 Jahren

Hallo zerberos,

hab nun nicht wirklich mehr die Erinnerung, wie das genau funktioniert, hier mal meine Vermutungen:

Es gibt über den EventArg die Option ein "e.Cancel" auf True bzw. False zu setzen, ich vermute mal blind, dass dieses Ergebnis dann ein "Validierung positiv/negativ" festlegt, probier diese Option doch mal aus.

Ein anderer Ansatz ist, den Wert der Zelle auf "0.0" zu setzen, anstatt ihn leer zu lassen, da kann ich aber nicht sagen, ob das fachlich richtig ist.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

Z
zerberos Themenstarter:in
520 Beiträge seit 2007
vor 15 Jahren

0.0 geht leider auch fachlichen Gründne nicht. Das wäre natürlich das einfachste

Z
zerberos Themenstarter:in
520 Beiträge seit 2007
vor 15 Jahren

Keine ne Lösung?

Ich verstehe nicht warum das nicht funktioniert mit System.DBNULL

Wenn ich mir nach dem starten den Inhalt eines leeren Feldes ansehe, dann steht da auch System.DBNULL drinnen.

Wenn ich jetzt aber beim CellValidating den Inhalt auf System.DBNULL setzte schmeißt der mir aber die Fehlermeldung

Hier mein Code.

Vielleicht aknn mir einer etwas helfen


private void DGV_A_CellValidating(object sender, System.Windows.Forms.DataGridViewCellValidatingEventArgs e)
{
    if (string.IsNullOrEmpty(e.FormattedValue.ToString())) {
        DGV_A.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = System.DBNull.Value;
    }
}