मेरे पास एक प्रोग्राम है जो मैं अपनी कंपनी को टूल कैलिब्रेशन का ट्रैक रखने में मदद करने के लिए लिख रहा हूं। मेरे पास SQLite डेटाबेस में सहेजे गए सभी टूल्स हैं, जिनमें कॉलम प्रकार को DATETIME पर सेट करने का विकल्प नहीं है। इसलिए मैंने तारीखों को आसान रखने के लिए M/D/YYYY प्रारूप में संग्रहीत किया है।

मेरे पास मॉडल डेटाबेस से टूल इन्वेंट्री खींचता है और पॉप्युलेट टेबल को व्यूमोडेल पर वापस कर देता है।

यहां से मैंने व्यूमोडेल डेटा तालिका को डेटा ग्रिड में बाध्य किया है, साथ ही डेटा तालिका में प्रत्येक डेटा ग्रिड कॉलम को उपयुक्त कॉलम में बाध्य किया है।

मैं चाहता हूं कि उपयोगकर्ता "अंशांकन देय" कॉलम को नवीनतम से सबसे पुराने या सबसे पुराने से नवीनतम तक सॉर्ट करने में सक्षम हो।

समस्या यह है कि चूंकि SQLite और डेटाग्रिड नियंत्रण दोनों में डेटटाइम कॉलम के विकल्प नहीं हैं, इसलिए डेटाग्रिड इन्हें स्ट्रिंग के रूप में सॉर्ट करना जारी रखता है।

डेटाग्रिड कॉलम डेटाग्रिडटेक्स्ट कॉलम के रूप में सेट हैं क्योंकि मुझे पता नहीं चला कि कोई टेम्पलेट कॉलम इसे ठीक करेगा, या यहां तक ​​​​कि इसका उपयोग कैसे करें।

I.E. :

9/26/2017

9/12/2017

8/5/2017

8/28/2017

मैंने तारीखों को MM/DD/YYYY प्रारूप में बदलने की कोशिश की है, लेकिन यह काम नहीं किया। क्या कोई मुझे यह पता लगाने में मदद कर सकता है कि इन तिथियों के लिए उचित छँटाई प्राप्त करने के लिए मुझे क्या करने की आवश्यकता है?

मैं Caliburn.Micro और SQLite का उपयोग कर रहा हूं यदि यह संभावित समाधानों को कम करने में मदद करता है।

चेकऑटइनमॉडल:

    public DataTable RetrieveToolRoster()
    {
        string db_command = "SELECT [id], [cal_date] FROM inventory WHERE [cal_date] IS NOT NULL ORDER BY [id] ASC;";
        SQLiteConnection db_connection = new SQLiteConnection(Properties.Settings.Default.db_connectionstring);
        SQLiteDataAdapter db_dataAdapter = new SQLiteDataAdapter(db_command, db_connection);
        DataTable tr_dataTable = new DataTable();

        try
        {
            db_connection.Open();
            db_dataAdapter.Fill(tr_dataTable);
            db_connection.Close();
            return tr_dataTable;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error:\r\n" + ex.Message);
            return null;
        }
    }

चेकऑटइनव्यूमॉडल:

    private DataTable _toolRoster;
    public DataTable ToolRoster
    {
        get { return _toolRoster; }
        set
        {
            _toolRoster = value;
            NotifyOfPropertyChange(() => ToolRoster);
        }
    }
    public void PopulateToolRoster()
    {
        CheckOutInModel coim = new CheckOutInModel();
        ToolRoster = coim.RetrieveToolRoster();
    }

चेकआउटइनव्यू:

    <DataGrid Grid.Column="0"
              ItemsSource="{Binding ToolRoster}"
              Style="{DynamicResource DataGridStandard}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Tool ID"
                                Width="*"
                                Binding="{Binding id}"/>
            <DataGridTextColumn Header="Calibration Due"
                                Width="*"
                                Binding="{Binding cal_due, StringFormat={}{0:d}}"/>
        </DataGrid.Columns>
    </DataGrid>

शुक्रिया!

समाधान

मैंने डेटा तालिका से डेटा को एक सूची में भर दिया और सूची वापस कर दी।

चेकऑटइनव्यूमॉडल:

    private List<RosterData> _toolRoster;

    public List<RosterData> ToolRoster
    {
        get { return _toolRoster; }
        set
        {
            _toolRoster = value;
            NotifyOfPropertyChange(() => ToolRoster);
        }
    }

चेकऑटइनमॉडल:

    public List<RosterData> RetrieveToolRoster()
    {
        string db_command = "SELECT [id], [cal_date] FROM inventory WHERE [cal_date] IS NOT NULL ORDER BY [id] ASC;";
        SQLiteConnection db_connection = new SQLiteConnection(Properties.Settings.Default.db_connectionstring);
        SQLiteDataAdapter db_dataAdapter = new SQLiteDataAdapter(db_command, db_connection);
        DataTable tr_dataTable = new DataTable();

        try
        {
            db_connection.Open();
            db_dataAdapter.Fill(tr_dataTable);
            db_connection.Close();
            List<RosterData> rd = new List<RosterData>();                
            foreach (DataRow dr in tr_dataTable.Rows)
            {
                RosterData rds = new RosterData();
                rds.id = dr[0].ToString();
                rds.cal_date = Convert.ToDateTime(dr[1]);
                rd.Add(rds);
            }
            return rd;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error:\r\n" + ex.Message);
            return null;
        }
    }

रोस्टरडाटा.सीएस:

public class RosterData
{
    public string id { get; set; }
    public DateTime cal_date { get; set; }
}
1
Jonny Small 16 अक्टूबर 2017, 22:29

2 जवाब

सबसे बढ़िया उत्तर

डेटाटेबल लोड करने के बजाय बस अपनी कस्टम क्लास को परिभाषित करें। SQLiteDateReader का उपयोग करें और प्रत्येक रिकॉर्ड को अपने कस्टम वर्ग की सूची के एक तत्व में बदलें

public class RosterData
{
    public int id {get;set;}
    public DateTime cal_date {get;set;}
}

public List<RosterData> RetrieveToolRoster()
{
    string List<RosterData> result = new List<RosterData>();
    string db_command = "SELECT [id], [cal_date] FROM inventory WHERE [cal_date] IS NOT NULL ORDER BY [id] ASC;";
    using(SQLiteConnection db_connection = new SQLiteConnection(Properties.Settings.Default.db_connectionstring))
    using(SQLiteCommand cmd = new SQLiteCommand(db_command, db_connection))
    {
        try
        {
            db_connection.Open();
            using(SQLiteDataReader reader = cmd.ExecuteReader())
            {
                while(reader.Read())
                {
                    RosterData rd = new RosterData()
                    {
                        rd.id = Convert.ToInt32(rd["id"]);
                        rd.cal_date = Convert.ToDateTime(rd["cal_date"]);
                    };
                    result.Add(rd);
               }
           }
           return result;
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error:\r\n" + ex.Message);
            return null;
        }

    }
}

.......

private List<RosterData> _toolRoster;
public List<RosterData> ToolRoster
{
    get { return _toolRoster; }
    set
    {
        _toolRoster = value;
        NotifyOfPropertyChange(() => ToolRoster);
    }
}
2
Steve 16 अक्टूबर 2017, 23:05

इसे एक नंबर के रूप में स्टोर/पुनर्प्राप्त करना आसान हो सकता है। जब आप इसे क्वेरी करते हैं तो आप इसे सॉर्ट कर सकते हैं और बस डिस्प्ले टाइम पर वापस कनवर्ट कर सकते हैं।

DateTime.Ticks आपको एक लंबा समय देगा जो नैनोसेकंड की संख्या है।

फिर आप इसे डीबी में स्टोर कर सकते हैं और इसे पुनर्प्राप्ति पर डेटटाइम में वापस बदल सकते हैं:

new DateTime(number)

क्वेरी पर छाँटना तब आसान होता है, क्योंकि जिस किसी में भी "टिक" की संख्या सबसे अधिक होती है, वह भविष्य का सबसे अधिक दिनांक समय होता है।

0
dillius 16 अक्टूबर 2017, 22:43