我开发了一个
WinForm
c#应用程序,现在添加了一个恢复选项,这样如果它意外关闭等,一切都可以在新的运行中恢复。
我已经成功恢复了几乎所有内容(列表、整数、字符串等...) 我面临的唯一问题是恢复
DataTable
。在我的应用程序运行期间,记录会添加到此 DataTable
,最终用户可以将其导出到 csv。
我尝试将
DataTable
添加到 Properties.Settings.Default
...但它在新运行中不起作用,我总是将其视为 Null
。
有关保存和恢复的最佳方法的任何建议
DataTable
请记住,它们的记录在运行期间可能会超过 10-15 k。
谢谢你
Properties.Settings
可以存储字符串数据,因此您可以序列化您的DataTable
并存储它。稍后您可以反序列化该字符串以获得 DataTable
。您可以使用JSON.Net,例如:
var serializedDt = JsonConvert.SerializeObject(dt);
//store the string
取回:
DataTable yourDataTable = JsonConvert.DeserializeObject<DataTable>(serializedDt);
还要补充一点,如果您期望大量数据,那么您可以考虑在客户端的数据库中存储数据的选项,例如Sqlite。
序列化对象,但将其放入恢复文件中。 在恢复开始期间只需读取文件,您不必担心空间。
您可以使用“扩展方法”方法,向应用程序添加静态类来扩展 DataTable 对象的功能。 方法中“type”之前的“this”修饰符告诉编译器这将是基本类型的扩展。
因此,每当您声明 DataTable 对象时,您都可以使用这个新方法,并且您可以注意到,当您调用该方法时,受“this”修饰符影响的参数不会出现。
此示例依赖于 Newtonsoft.json(Nuget 包)。
数据表 dt = new()
...
dt.LoadFromFile(“myjsonfile.json”);
...做一些事情...
dt.SaveToFile(“myjsonfile.json”);
public static class DataTableHelper
{
/// <summary>
/// Save DataTable content to Json File
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static bool SaveToFile( this DataTable dt, string fileName )
{
try
{
File.WriteAllText(fileName, JsonConvert.SerializeObject(dt, Formatting.Indented));
}
catch
{
return false;
}
return true;
}
/// <summary>
/// Load Json File into DataTable
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static int LoadFromFile(this DataTable dt, string fileName)
{
try
{
string data = File.ReadAllText(fileName);
dt = JsonConvert.DeserializeObject<DataTable>(data);
}
catch
{
return 0;
}
return dt.Rows.Count;
}
}
您可以在此链接中了解有关扩展方法的更多信息: