我有一个程序我写信是为了帮助我的公司跟踪工具校准。我将所有工具保存在SQLite数据库中,该数据库没有将列类型设置为DATETIME的选项。所以我以M / D / YYYY格式存储日期以保持简单。
我让模型从数据库中提取工具库存并将填充的表格返回到viewmodel。
从这里我将viewmodel数据表绑定到数据网格,同时将每个数据网格列绑定到数据表中的相应列。
我希望用户能够对"校准到期"进行排序。从最新到最旧或最旧到最新的列。
问题是,由于SQLite和DataGrid控件似乎都没有DateTime列的选项,因此datagrid继续将这些选项排序为字符串。
DataGrid列设置为DataGridTextColumns,因为我无法确定模板化列是否能解决这个问题,甚至是如何使用它。
I.E. :
9/26/2017
9/12/2017
8/5/2017
8/28/2017
我尝试将日期转换为MM / DD / YYYY格式,但这并不奏效。 谁能帮我弄清楚我需要做些什么才能对这些日期进行适当的排序?
我使用Caliburn.Micro和SQLite,如果这有助于缩小可能的解决方案范围。
CheckOutInModel:
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;
}
}
CheckOutInViewModel:
private DataTable _toolRoster;
public DataTable ToolRoster
{
get { return _toolRoster; }
set
{
_toolRoster = value;
NotifyOfPropertyChange(() => ToolRoster);
}
}
public void PopulateToolRoster()
{
CheckOutInModel coim = new CheckOutInModel();
ToolRoster = coim.RetrieveToolRoster();
}
CheckOutInView:
<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>
谢谢!
解决方案
我将数据从填充的数据表传输到列表并返回列表。
CheckOutInViewModel:
private List<RosterData> _toolRoster;
public List<RosterData> ToolRoster
{
get { return _toolRoster; }
set
{
_toolRoster = value;
NotifyOfPropertyChange(() => ToolRoster);
}
}
CheckOutInModel:
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;
}
}
RosterData.cs:
public class RosterData
{
public string id { get; set; }
public DateTime cal_date { get; set; }
}
答案 0 :(得分:2)
只需定义自定义类,而不是加载数据表。使用SQLiteDateReader并将每个记录转换为自定义类的List的元素
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);
}
}
答案 1 :(得分:0)
将数字存储/检索可能更容易。然后,您可以在查询时对其进行排序,并在显示时转换回来。
DateTime.Ticks
会给你一个长的纳秒数。
然后,您可以将其存储在数据库中,并在检索时将其转换回DateTime:
new DateTime(number)
对查询进行排序很容易,因为最大数量的“滴答”是最新的DateTime。