Benutzer mit den meisten Antworten
Code in Mvvm Pattern

Frage
-
<DataGrid AutoGenerateColumns="False" Canvas.Left="73" Canvas.Top="38" Height="137" Name="dataGrid1" Width="391"
SelectionMode="Single"
AlternatingRowBackground="Yellow"
CanUserResizeColumns="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserSortColumns="False"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
SelectedIndex="{Binding ZeilenIndexDienstwagen}">
<DataGrid.ItemsSource>
<Binding Path="DienstwagenListe" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
</DataGrid.ItemsSource>
<DataGrid.Columns>
<!-- erste Spalte -->
<DataGridTemplateColumn Header="Hersteller" Width="*">
<DataGridColumn.HeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
</DataGridColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Hersteller}" Margin="5,0,0,0" FontFamily="Courier New" FontSize="12"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>public class DataChangedEventArgs : EventArgs
{
private List<Object[]> liste;
public DataChangedEventArgs(List<Object[]> liste)
{
this.liste = liste;
}
public List<Object[]> Liste
{
get { return liste; }
}private string message;
public MessageChangedEventArgs(string message)
{
this.message = message;
}
public string Message
{
get { return message; }
}private string tb_dienstwagen = "Dienstwagen";
private string tb_dienstfahrt = "Dienstfahrt";
// private static string url = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=";
private static string url = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
private static DBZugriffOleDbMSAccess db = null; // Singleton
private event EventHandler<DataChangedEventArgs> dienstwagenChanged;
public EventHandler<DataChangedEventArgs> DienstfahrtenChanged = delegate{};
// private event EventHandler<DataChangedEventArgs> dienstfahrtChanged;
public event EventHandler<MessageChangedEventArgs> MessageChanged;
private DBZugriffOleDbMSAccess(string path)
: base(url + path, "", "")
{
}
public static DBZugriffOleDbMSAccess GetInstance(string path)
{
if (db == null)
db = new DBZugriffOleDbMSAccess(path);
return db;
}
public EventHandler<DataChangedEventArgs> DienstwagenChanged
{
get { return dienstwagenChanged; }
set { dienstwagenChanged = value; OnDienstwagenChanged(); }
}
protected void OnDienstwagenChanged()
{
if (dienstwagenChanged != null)
{
dienstwagenChanged(this, new DataChangedEventArgs(db.GetObjectDataDienstwagen()));
}
}
private List<Object[]> GetObjectDataDienstwagen()
{
string sqlstring = "select * from " + tb_dienstwagen;
return base.GetObjectData(sqlstring);
}
private List<object[]> GetObjectDataDienstfahrt(int id)
{
string sqlstring = "select * from " + tb_dienstfahrt + " where Dienstwagen_ID=" + id;
return base.GetObjectData(sqlstring);
}
public void InsertDienstwagen(object sender, DataChangedEventArgs arg)
{
object[] data = arg.Liste[0];
string hersteller = Convert.ToString(data[0]);
string typ = Convert.ToString(data[1]);
string kennzeichen = Convert.ToString(data[2]);
string sqlstring = "Insert into "+tb_dienstwagen+" (Hersteller,Typ,Kennzeichen) values("
+"'"+hersteller+"',"
+"'"+typ+"',"
+"'"+kennzeichen+"')";
int ret= base.ExecuteNonQuery(sqlstring);
if( MessageChanged != null )
MessageChanged(this, new MessageChangedEventArgs("Es wurde(n) "+ret+" Dienstwagen gespeichert !"));
OnDienstwagenChanged();
}
public void InsertDienstfahrt(object sender, DataChangedEventArgs arg)
{
object[] data = arg.Liste[0];
int id = Convert.ToInt32(data[0]);
string Grund = Convert.ToString( data[1] );
string Anfangs_km = Convert.ToString( data[2] ).Replace(',','.');
string End_km = Convert.ToString( data[3] ).Replace(',','.');;
string Datum = Convert.ToString(data[4]);
string Benutzer = Convert.ToString(data[5]);
int ret = 0;
string sqlstring = "Insert into "+tb_dienstfahrt+ " (Grund,DienstfahrtDatum,Anfangs_km_Stand,End_km_Stand,Nutzername,Dienstwagen_ID) values("
+"'"+Grund+"',"
+"'"+Datum+"',"
+Anfangs_km+","
+End_km+","
+"'"+Benutzer+"',"
+id+")";
ret = db.ExecuteNonQuery(sqlstring);
if (MessageChanged != null)
MessageChanged(this, new MessageChangedEventArgs("Es wurde(n) "+ret+" Dienstfahrt(en) gespeichert !"));
// OnDienstfahrtChanged(id);
}
public void SelectDienstfahrten(object sender, DataChangedEventArgs arg)
{
int id = Convert.ToInt32(arg.Liste[0][0]);
DienstfahrtenChanged(this, new DataChangedEventArgs( this.GetObjectDataDienstfahrt(id)));
}// private DBZugriffOleDbMSAccess db;
private ObservableCollection<Dienstwagen> dienstwagenListe; // Eine Datenliste für eine Tabelle in der Datenbank. Spezifizieren Sie den Klassentyp
private ObservableCollection<Dienstfahrt> dienstfahrtListe;
public event EventHandler<MessageChangedEventArgs> MessageChanged;
// private ObservableCollection<Dienstfahrt> dienstfahrtliste;
private EventHandler<DataChangedEventArgs> insertDienstfahrtChanged;
public EventHandler<DataChangedEventArgs> SelectDienstwagenChanged = delegate { };
private String fehlermeldung;
private string grund;
private string anfangs_km;
private string end_km;
private string benutzer;
private string summeKm;
private int zeilenIndexDienstwagen;
private int dienstwagenIndex;
private DateTime datum;
private ICommand speichernCommand;
private ICommand zuruecksetzenCommand;
#endregion
#region Konstruktor
public MainViewModel()
{
dienstwagenListe = new ObservableCollection<Dienstwagen>();
dienstfahrtListe = new ObservableCollection<Dienstfahrt>();
speichernCommand = new RelayCommand(OnSpeichernExecuted, OnSpeichernCanExecute);
zuruecksetzenCommand = new RelayCommand(OnZuruecksetzenExecuted);
Grund = "";
Benutzer = "";
Anfangs_km = "";
End_km = "";
Datum = DateTime.Now;
ZeilenIndexDienstwagen = -1;
SummeKm = "";
DienstwagenIndex = -1;
}
#endregion
#region Properties für Daten
// Properties und andere Methoden rufen beim Verändern die geerbte Methode OnPropertyChanged-Methode auf
public String Fehlermeldung
{
get { return fehlermeldung; }
set { fehlermeldung = value; OnPropertyChanged("Fehlermeldung"); }
}
public ObservableCollection<Dienstwagen> DienstwagenListe
{
get { return dienstwagenListe; }
set { dienstwagenListe = value; OnPropertyChanged("DienstwagenListe"); }
}
public ObservableCollection<Dienstfahrt> DienstfahrtListe
{
get { return dienstfahrtListe; }
set { dienstfahrtListe = value; OnPropertyChanged("DienstfahrtListe"); }
}
public int ZeilenIndexDienstwagen
{
get { return zeilenIndexDienstwagen; }
set
{
zeilenIndexDienstwagen = value; OnPropertyChanged("ZeilenIndexDienstwagen");
}
}
public int DienstwagenIndex
{
get { return dienstwagenIndex; }
set { dienstwagenIndex = value;OnPropertyChanged("DienstwagenIndex");
OnDienstwagenIndexChanged(); }
}
public DateTime Datum
{
get { return datum; }
set { datum = value; OnPropertyChanged("Datum"); }
}
public string Benutzer
{
get { return benutzer; }
set { benutzer = value; OnPropertyChanged("Benutzer"); }
}
public string End_km
{
get { return end_km; }
set { end_km = value; OnPropertyChanged("End_km"); }
}
public string Anfangs_km
{
get { return anfangs_km; }
set { anfangs_km = value; OnPropertyChanged("Anfangs_km"); }
}
public string Grund
{
get { return grund; }
set { grund = value; OnPropertyChanged("Grund"); }
}
public string SummeKm
{
get { return summeKm; }
set { summeKm = value; OnPropertyChanged("SummeKm"); }
}
#endregion
#region Properties für Commands
public ICommand SpeichernCommand
{
get { return speichernCommand; }
set { speichernCommand = value; }
}
public ICommand ZuruecksetzenCommand
{
get { return zuruecksetzenCommand; }
set { zuruecksetzenCommand = value; }
}
#endregion
#region Executed- und CanExecute-Methoden
// Implementierung dieser Methode
private void OnSpeichernExecuted(object obj)
{
int pos = ZeilenIndexDienstwagen;
int id = dienstwagenListe[pos].Dienstwagen_ID;
object[] data = new string[6];
data[0] = "" + id;
data[2] = Anfangs_km.Replace(',', '.');
data[3] = End_km.Replace(',', '.');
data[1] = Grund;
data[4] = Datum.ToString();
data[5] = Benutzer;
List<object[]> temp = new List<object[]>();
temp.Add(data);
if (insertDienstfahrtChanged != null)
insertDienstfahrtChanged(this, new DataChangedEventArgs(temp));
}
private void OnZuruecksetzenExecuted(object obj)
{
Grund = "";
Benutzer = "";
Anfangs_km = "";
End_km = "";
Datum = DateTime.Now;
ZeilenIndexDienstwagen = -1;
}
private bool OnSpeichernCanExecute(object obj)
{
double _anfangs_km = 0, _end_km=0 ;
if( ZeilenIndexDienstwagen < 0)
{
Fehlermeldung="Sie müssen einen Dienstwagen auswählen !";
return false;
}
if (grund.Equals("") || benutzer.Equals("") || anfangs_km.Equals("") || end_km.Equals(""))
{
Fehlermeldung = "Es müssen alle Felder ausgefüllt werden !";
return false;
}
try
{
_anfangs_km = Convert.ToDouble(anfangs_km.Replace('.',';'));
}
catch
{
Fehlermeldung = "Fehlerhafte Zeichen im Feld für Anfangskilometerstand !";
return false;
}
try
{
_end_km = Convert.ToDouble(end_km.Replace('.', ';'));
}
catch
{
Fehlermeldung = "Fehlerhafte Zeichen im Feld für Endkilometerstand !";
return false;
}
if (_end_km <= _anfangs_km)
{
Fehlermeldung = "Der Endkilometerstand muss größer als der Anfangskilometerstand sein !";
return false;
}
Fehlermeldung = "";
return true;
}
#endregion
#region Update-Methode für Observer-Pattern
public EventHandler<DataChangedEventArgs> InsertDienstfahrtChanged
{
get { return insertDienstfahrtChanged; }
set { insertDienstfahrtChanged = value; }
}
public void UpdateDienstwagen(object sender, DataChangedEventArgs obj)
{
List<Object[]> temp = obj.Liste;
dienstwagenListe.Clear();
foreach (Object[] o in temp)
DienstwagenListe.Add(ConvertToDienstwagen(o));
}
public void UpdateDienstfahrten(object sender, DataChangedEventArgs obj)
{
List<object[]> temp = obj.Liste;
dienstfahrtListe.Clear();
foreach (object[] o in temp)
DienstfahrtListe.Add(ConvertToDienstfahrt(o));
}
private void OnDienstwagenIndexChanged()
{
if (dienstwagenIndex >= 0 && dienstwagenIndex < dienstwagenListe.Count)
{
int id = dienstwagenListe[dienstwagenIndex].Dienstwagen_ID;
List<object[]> temp = new List<object[]>() { new object[]{id.ToString()}};
SelectDienstwagenChanged(this, new DataChangedEventArgs(temp));
if (dienstfahrtListe.Count > 0)
{
double summe = 0;
foreach (Dienstfahrt d in dienstfahrtListe)
summe += d.GefahreneKm;
SummeKm = string.Format("{0:F1}",summe);
}
else
{
SummeKm = "";
}
}
}
#endregion
#region Umwandlungsmethoden
private Dienstwagen ConvertToDienstwagen(object[] obj)
{
int dienstwagen_ID = Convert.ToInt32(obj[0]);
string hersteller = Convert.ToString(obj[1]);
string typ = Convert.ToString(obj[2]);
string kennzeichen = Convert.ToString(obj[3]);
return new Dienstwagen(dienstwagen_ID, hersteller, typ, kennzeichen); ;
}
private Dienstfahrt ConvertToDienstfahrt(object[] obj)
{
int dienstfahrt_ID = Convert.ToInt32(obj[0]);
string grund = Convert.ToString(obj[1]);
DateTime datum = Convert.ToDateTime(obj[2]);
double anfangskm = Convert.ToDouble(obj[3].ToString().Replace('.', ','));
double endkm = Convert.ToDouble(obj[4].ToString().Replace('.', ','));
string nutzer = Convert.ToString(obj[5]);
int dienstwagen_ID = Convert.ToInt32(obj[6]);
return new Dienstfahrt(dienstfahrt_ID, grund, datum, anfangskm, endkm, nutzer, dienstwagen_ID);
}
#endregion
}
}
Kann man den Code so lassen?
Gruss Absolut
- Bearbeitet Absolut86 Donnerstag, 20. August 2015 23:35
- Typ geändert Tom Lambert (Koopakiller)Moderator Freitag, 21. August 2015 01:30
Antworten
-
Hallo,
ich kann bei deinem Code leider nicht so wirklich die Zusammenhänge erkennen. Bitte bearbeite deinen Beitrag nachträglich und formatiere den Code dabei in separaten Code-Blöcken damit es leserlicher wird. Weiterhin solltest du jeweils dran schreiben was es ist. Im jetzigen Zustand kann man nur raten.
Das erste was mir auffiel ist dein Object-Array, welches du scheinbar auch in den EventArgs nutzt. Tausch es besser gegen eine eigene Klasse aus, die für die Elemente typisierte Eigenschaften bereit stellt.
Statt dem try...catch um Convert.ToDouble solltest du double.TryParse verwenden. Das ist kürzer, übersichtlicher und spart das Exception-Handling.
Statt .Equals("") zu nutzen um leere Strings zu erkennen solltest du entweder string.IsNullOrEmpty verwenden oder die Length-Eigenschaft abfragen. Beides ist effizienter.
Wenn du unter .NET 4.5 arbeitest, dann solltest du das CallerMemberName-Attribute auf deinen OnPropertyChanged-Methoden-Parameter anwenden. So kannst du dir das übergeben der Eigenschaftennamen sparen. Ab C# 6 könntest du das Eventhandling auch direkt per ?. Operator das Event auslösen - ich persönlich mag das aber nicht so sehr.
Statt dem manuell zusammen gebastelten SQL String solltest du Parameter verwenden um SQL Injection zu verhindern.
Statt den tollen Basteleien mit , und . vor dem Konvertieren von Strings in Zahlen solltest du einfach die gewünschte CultureInfo an die Parse/TryParse/Convert Methode übergeben. Standardmäßig wird die Kultur des Systems dafür verwendet.
Autoimplementierte Eigenschaften könnten ein paar Zeilen bei den Commands sparen.
Setter bei Eigenschaften die einen Listentyp haben sind eher unüblich. Sie machen keine Probleme sofern sie PropertyChanged aufrufen, aber du wirst kaum Listen in .NET finden die man setzen kann.
Ich persönlich mag es nicht auf Deutsch zu programmieren - das muss aber jeder selbst wissen. Was du aber unbedingt vermeiden solltest ist ein Denglishc draus zu machen. ConvertToDienstwagen, ...
Nun nochmal was zu MVVM: Statt der Fehlerbehandlungen im Execute-Event der Commands solltest du besser eine entsprechende CanExecute-Methode schreiben die das abprüft.
Das ist das was mir auf die Schnelle auffiel.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 26. August 2015 14:06
- Als Antwort markiert Aleksander Chalabashiev Donnerstag, 3. September 2015 06:56