在Visual Studio 2015 Express(Windows窗体应用程序)中填充DataSet?
我想知道是否有简单的方法来做到这一点。我用DataSet创建了一个简单的Windows窗体应用程序,并创建了一个包含几列(ID,标题,说明,开发人员,年)的表格(游戏)。在Visual Studio 2015 Express(Windows窗体应用程序)中填充DataSet?
然后,我创建了一个引用这个DataSet的ListBox对象,并选择了一列显示(Games.Title)。然后在ListBox旁边有几个标签来显示其他列的值。
现在我想知道如果我能填补在Visual Studio中的数据集没有太多的编码 - 就像你在MS Access编辑Access数据库...
目前我填充DataSet与在下面的代码应用程序的启动:
DataRow CrNewLine = dataSet1.Tables["Games"].NewRow();
CrNewLine["Title"] = "The Title of the Game";
CrNewLine["Description"] = "This is the Description. Farewell.";
CrNewLine["Developer"] = "Warner Interactive Entertainment Ltd.";
CrNewLine["Year"] = "1996";
dataSet1.Tables["Games"].Rows.Add(CrNewLine);
但是,这是非常激烈的代码,如果我想在这个表中添加200行... 而且我不希望使用外部源,如SQL数据库或Access数据库。 数据,代码和应用程序在编译后应该全部在一个EXE中。
那么是一个更简单的方法来填充数据集表的值?
感谢您的任何答案!
一种选择是将文件存储为JSON
文本文件,将其作为Embedded Resource
嵌入到应用程序中。
使用示例JSON文件,如下面:
{
"Data": [
{
"Title": "Title 1",
"Description": "Description 1",
"Developer": "Developer 1",
"Year": 1996
},
{
"Title": "Title 2",
"Description": "Description 2",
"Developer": "Developer 2",
"Year": 1997
},
{
"Title": "Title 3",
"Description": "Description 3",
"Developer": "Developer 3",
"Year": 1998
}
]
}
接下来,您可以嵌入到您的解决方案这种通过改变生成操作(在属性面板),以Embedded Resource
这将嵌入你的JSON数据文件到您的装配输出。我们可以使用JSON.Net
将数据反序列化为Dataset
。
public static DataSet LoadData()
{
var asm = typeof(Program).Assembly;
var jsonText = "";
using(var stream = asm.GetManifestResourceStream($"{asm.GetName().Name}.data.json"))
{
using (var reader = new StreamReader(stream))
{
jsonText = reader.ReadToEnd();
}
}
DataSet dataSet = null;
try
{
dataSet = JsonConvert.DeserializeObject<DataSet>(jsonText);
}
catch
{
}
return dataSet;
}
上面的方法非常简单。首先我们从程序集中读取JSON数据(文件名是data.json
)。注意文件的路径应该是YourNameSpace.<FileName>
接下来我们使用JsonConvert.DeserializeObject<DataSet>()
来返回将JSON文本转换为Dataset
对象。结果将包含一个名为Data
(我们的JSON文件的根节点)的表,然后可以在您的应用程序中使用该表。
现在您只需添加到JSON文件即可添加更多数据。现在,如果您想将此文件包含到您的程序集(exe)中,并且没有添加文件,您将无法向其写入数据(如嵌入到应用程序中)。
但是,如果您需要写入权限,您可以(启动时)检测文件是否存在于应用程序路径中。如果它不存在,则可以读取默认数据文件,然后将内容写入如下所示的输出文件。
public static DataSet LoadDataSet()
{
var asm = typeof(Program).Assembly;
string filePath = Path.GetDirectoryName(asm.CodeBase).ToLowerInvariant().Replace(@"file:\", "");
filePath = Path.Combine(filePath, "data.json");
string jsonText = null;
if (!File.Exists(filePath))
{
using (var stream = asm.GetManifestResourceStream($"{asm.GetName().Name}.data.json"))
{
using (var fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.ReadWrite))
{
stream.CopyTo(fs);
}
}
}
else
jsonText = File.ReadAllText(filePath);
DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(jsonText);
return dataSet;
}
public static void SaveDataSet(DataSet dataSet)
{
var asm = typeof(Program).Assembly;
string filePath = Path.GetDirectoryName(asm.CodeBase).ToLowerInvariant().Replace(@"file:\", "");
filePath = Path.Combine(filePath, "data.json");
string jsonText = JsonConvert.SerializeObject(dataSet, Formatting.Indented);
File.WriteAllText(filePath, jsonText);
}
在上面这个例子中,我们首先检查,看看是否在文件中的当前应用程序目录中存在加载Dataset
。如果它不存在,我们使用FileStream
有效地将嵌入式资源中的内容复制到磁盘。
然后我们可以直接调用File.ReadAllText()
从磁盘读取内容,然后使用前面的方法将其转换为数据集。
然后我们有一个方法来保存对数据集的更改。现在,由于资源嵌入到应用程序中,我们无法修改程序集中的版本,但是我们可以覆盖磁盘上的文件。
你可以把所有的数据在一个XML文件,并调用dataSet.ReadXml()
如果你想一些帮助的模式,把数据的几行到您的数据集,并dataSet.writeXml()然后在文本编辑器中将其打开并获得它如何构建和扩展的想法..
您可以使用[Rows.Add](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable -dataview/adding-data-to-a-datatable)在一个语句中添加行的值,但即使是200行,这也是一项繁重的任务。如果你不想要一个数据库,你可以使用一个简单的文本文件。 –