Hallo Community,
wie kann ich ein DataGridView Object als Parameter verwenden?
Dieses hier nimmt der Compiler:
private DateTime convertDateTime(object sender, DataGridViewCellEventArgs e, DataGridView DGName, string cellName, string format) {
// formatiert ein String -> DateTime
return convertedDateTime;
}
Es funktioniert aber nicht.
Die Funktion soll aus einem CellContentClick Event aufgerufen werden, da TryParseExact etc. etc. zu lang ist möchte ich eine Funktion erschaffen die den Code vereinfacht und strukturiert.
Das DataGrid ist immer dasselbe bzw. soll ja übergeben werden können innerhalb der selben Klasse.
Gruß.
Gibts nicht.
Was genau du vor hast wird mir nicht ganz klar.
-> Wozu brauchst du das DGV, wenn du immer convertedDateTime zurück gibst?
-> Ich bin nicht sicher, was in sender drin steht, aber es müsste etwas vom DGV sein
In WPF solltest du MVVM verwenden. Hier kannst du dann das notwendige als Parameter binden.
Siehe dazu [Artikel] MVVM und DataBinding
Auch die Formatierung würde man im XAML definieren.
Weeks of programming can save you hours of planning
Hallo,
ich habe mir eine Funktion gebaut die:
DateTime.TryParseExact(datum, format, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out convertedDateTime);
wrapped sodass ich innerhalb der Klasse oder Form diese jederzeit aufrufen kann ohne das ich kilometerlange Codezeilen haben um und es einfach übersichtlicher zu machen.
DataGrid currDataGrid = sender as DataGrid;
var tmpRow = currDataGrid.Rows[e.RowIndex];
Dieses funktioniert auch nicht..
Also nach meinem Verständniß müsste die Objectinstanz von der ich zugreife in sender enthalten sein, diesen sender gebe ich auch einfach aus der aufrufenden Funktion aus dem betreffenden DataGrid an meine Hilfsfunktion weiter.
Sollte doch nicht so schwer sein, oder?
ist einfach "this" Scope, ich bewege mich ja innerhalb desselbe Scopes der Objektinstanz.
Gibts nicht.
Das kannst du einfach per Debugger herausfinden, s. [Artikel] Debugger: Wie verwende ich den von Visual Studio?
Ich kenne die Debugger Funktion. Leider bringt das nicht weiter, das Programm läuft ja nur reagiert es nicht wie gewünscht. Ich bekomme auch keinerlei Fehlermeldungen bzw. Feedback.
Ich denke es liegt datan das das sender Object nicht richtig weitervererbt wird bzw. weitergegeben wird.
Die Funktion:
/// Konvertiert ein Datumswert aus einer DataGridView an der aktuellen Stelle in das Datumsformat: "ddMMyyyy" oder "HHmmssff"
/// für eine Weiterverarbeitung in den Archiven unter Benutzung des DB2 Quell Datumsformats
/// <param name="DGName">Designated DataGrid.</param>
/// <param name="cellName">Designated Cell.</param>
/// <param name="format">Designated DateTime Format.</param>
/// <param name="replace">Designated replace Format like "date" or "time"</param>
/// <returns> convertedDateTime as DateTime.</returns>
private DateTime convertDateTime(object sender, DataGridViewCellEventArgs e, string cellName, string format, string replace) {
DataGridView currDataGrid = sender as DataGridView;
var tmpRow = currDataGrid.Rows[e.RowIndex];
DateTime convertedDateTime;
if (replace == "date") { replace = tmpRow.Cells[cellName].Value.ToString().Replace(".", ""); } else if (replace == "time") { replace = tmpRow.Cells[cellName].Value.ToString().Replace(":", ""); }
DateTime.TryParseExact(replace, format, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out convertedDateTime);
return convertedDateTime;
}
}
Die aufrufende Funktion (CellContentKlickEvent funktioniert):
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) {
try {
DataGridView currDataGrid = sender as DataGridView;
var tmpRow = currDataGrid.Rows[e.RowIndex];
//var tmpRow = dataGridView1.Rows[e.RowIndex];
this.showSecondaryDataGrid(sender, e, convertDateTime(currDataGrid, e, "Datum", "yyyyMMdd","date").ToString("yyyyMMdd"), tmpRow.Cells["ErstUhrzeit"].Value.ToString().Replace(":", ""), convertDateTime(currDataGrid, e, "ReorgDatum", "yyyyMMdd","date").ToString("yyyyMMdd")); // DateTime muss zurückgewandelt werden
} catch (Exception exc) {
MessageBox.Show(exc.ToString(), "Exception set Datasource to null");
logger.textLogging("Exception Datasource\n-----------" + exc + "\n-----------\n");
}
}
Gibts nicht.
Anscheinend gehts. Manchmal hilft drüber reden ... 😉
War wahrscheinlich ein SEMIKOLON 😮)
Gibts nicht.
Im Endeffekt bleibt es aber eine Umsetzung, die man genau so eben nicht tun sollte.
Man sollte das im XAML machen; so ist es in WPF vorgesehen.
Mit so einem Vorgehen holt man sich - das zeigt die Erfahrung - rasch neue Probleme ins Haus, die man dann auch wieder nur mit einem Workaround lösen kann.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ok, verstehe was du meinst. Alternativ in die Config Datei? Habe da eine einfache txt.
Gibts nicht.
Welche Config Datei?
In deiner Oberflächenbeschreibung (=XAML), bzw dem View sollte die Repräsentation des Zeitstempels gesteuert werden.
P.S.:
So wie du TryParse..() verwendest ist es falscht. Nicht umsonst unterscheidet sich TryParse...() von Parse...().
P.P.S.:
Du übergibst ein Objekt dessen Typ du weißt trotzdem Boxed an deine convertDateTime Methode als object.
Dadurch bekommt die convertDateTime Methode mehr Aufgaben, als ihr Name aufzeigt und du bist in zweiter Instanz Typunsicher... was passiert, wenn sender in convertDateTime nicht vom Typ DataGridView ist?
Ok, das stimmt natürlich.
Bitte keine FUll Quotes
[Hinweis] Wie poste ich richtig?
Gibts nicht.