2016-06-18 13 views
1

ich bin neu in C# und WPF. Angenommen, ich habe einen Tisch. Diese Tabelle hat zwei Felder: "firstName" und "birthDate". Ich schreibe eine Abfrage, um "Geburtsdatum" Datensätze zu holen, dann möchte ich es auf einem Datagrid zeigen. vorher möchte ich mit einer funktion "gregorian date" in "jalali date" ändern.wie auf jedes Element einer Abfragevariablen zugreifen

in C#:

var searchQueryOfDateAndTime = (from b in FaceDB.tblCameras 
             join c in FaceDB.tblTraffics 
             on b.Camera_Id equals c.Camera_Id 
             join a in FaceDB.tblknownPeoples 
             on c.IdNumber equals a.IdNumber 

             where 
             (
              string.Compare(c.EntryDate.ToString(), miladiFromDate.ToString()) >= 0 
              && 
              string.Compare(c.EntryDate.ToString(), miladiToDate.ToString()) <= 0 
             ) 
             where 
             (
              string.IsNullOrEmpty(timFromHour.Text.ToString()) 
              || 
              string.Compare(c.EntryTime.ToString(), timFromHour.Text.ToString()) >= 0 
              && 
              string.IsNullOrEmpty(timToHour.Text.ToString()) 
              || 
              string.Compare(c.ExitTime.ToString(), timToHour.Text.ToString()) <= 0 
             ) 

             select new { a.Name, a.Family, EntryDate = Georgian2Jalali(c.EntryDate), c.EntryTime, a.Occupation, ExitDate = Georgian2Jalali(c.ExitDate), c.ExitTime, b.Camera_Name, c.PicAddress, a.FirstPicAddress, c.IdNumber, c.Camera_Id }).ToList(); 

     dgvFinalyReport.ItemsSource = searchQueryOfDateAndTime; 

und in WPF:

<DataGrid x:Name="dgvFinalyReport" Height="431" Width="630" Canvas.Left="273" Canvas.Top="10" AutoGenerateColumns="False" CanUserDeleteRows="False"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="firstname" Binding="{Binding Name}" Width="78" /> 
         <DataGridTextColumn Header="Last name" Binding="{Binding Family}" Width="78" /> 
         <DataGridTextColumn Header="Entry date" Binding="{Binding EntryDate}" Width="78" /> 
         <DataGridTextColumn Header="entry time" Binding="{Binding EntryTime}" Width="78" /> 
         <DataGridTextColumn Header="exit date" Binding="{Binding ExitDate}" Width="78" /> 
         <DataGridTextColumn Header="exit time" Binding="{Binding ExitTime}" Width="78" /> 
         <DataGridTextColumn Header="occupation" Binding="{Binding Occupation}" Width="78" /> 
         <DataGridTextColumn Header="Cam_Name" Binding="{Binding Camera_Name}" Width="78" /> 
         <DataGridTextColumn Header="getface" Binding="{Binding PicAddress}" Width="78" /> 
         <DataGridTextColumn Header="first face" Binding="{Binding FirstPicAddress}" Width="78" /> 
        </DataGrid.Columns> 
       </DataGrid> 

Antwort

1

Die andere Alternative ist es, einen Konverter zu schaffen, die den Gregorianischen Datum nimmt und wandelt sie in das Jalali Datum:

public class JalaliDateConverter : IValueConverter 
{ 
    public Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // Gregorian to Jalali conversion code 

     return jalaliaDate; 
    } 

    public ConvertBack((object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // Jalali to Gregorian conversion code 

     return gregorianDate; 
    } 
} 

Dann in Ihrem XAML Sie haben:

<DataGridTextColumn Header="Birth Day" 
        Binding="{Binding birthDate, Converter={StaticResource JalaliDateConverter}}" 
        Width="80" /> 

here Siehe für eine vollständigeres Tutorial zu Konvertern.

+0

Vielen Dank, aber was sind der Wert, targetType und Parameter? Wie verwende ich diese Klasse mit dem "select" -Befehl? – Saeid

+0

@ Saeid - diese Parameter sind die Standardwerte für die Konvertierungen. "value" ist der übergebene Wert - im Fall "Convert" das Gregorianische Datum, im Fall "ConvertBack" das Datum von Jalali. 'Parameter' ist null, weil Sie keinen angegeben haben (Sie brauchen ihn nicht). 'targetType' ist der Typ, der zurückgegeben wird. – ChrisF

+0

Sie verwenden es nicht mit dem Befehl select. Sie fügen die Konverterklasse zu Ihrem Projekt und den Konverter zu Ihrem XAML hinzu. – ChrisF

1

Da new {} erstellt eine schreibgeschützte anonymen Typ, Sie können nicht in einer Schleife durch Abfrage und die Werte von birth aktualisieren. Stattdessen können Sie den Wert direkt ändern:

var query = from f in mydb.mytbl.AsEnumerable() 
select new 
{ 
    f.firstName, 
    BirthDate = ConvertToJalali(f.BirthDate) 
}; 

private DateTime ConvertToJalali(DateTime dt) 
{ 
// your implementation here 
} 

Hinweis: von AsEnumerable() mit bewusst sein, da es alle Datensätze aus der Datenbank in den Speicher schleppt, aber in Ihrem speziellen Fall macht es keinen Unterschied machen, weil Sie don Ich habe keine Where-Klausel.

+0

vielen Dank, aber ich habe einen Fehler mit Ihrem Vorschlag. VS2015 rufen Sie mir diese Ausnahmebedingungsnachricht ab: LINQ to Entities erkennt die Methode 'System.DateTime Georgian2Jalali (System.DateTime)' nicht und diese Methode kann nicht in einen Geschäftsausdruck übersetzt werden. – Saeid

+0

@Said Da Sie keine where-Klausel haben, können Sie 'AsEnumerable()' hinzufügen, um die Speichererstellung von Objekten zu übernehmen, also ersetzen Sie 'mydb.mytbl' durch' mydb.mytbl.AsEnumerable() '. Nicht, dass wir dies normalerweise tun, wenn wir Filterbedingungen haben, aber in dem von Ihnen angegebenen Beispiel macht das keinen Unterschied. – user3185569

+0

aber in Wirklichkeit habe ich einige where-Klausel in meinem echten Code. Da wir Beschränkungen für Zeichen in "Kommentar" haben, habe ich obigen Code bearbeitet. grüße – Saeid

Verwandte Themen