在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中。

那么是一个更简单的方法来填充数据集表的值?

感谢您的任何答案!

+0

您可以使用[Rows.Add](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/dataset-datatable -dataview/adding-data-to-a-datatable)在一个语句中添加行的值,但即使是200行,这也是一项繁重的任务。如果你不想要一个数据库,你可以使用一个简单的文本文件。 –

一种选择是将文件存储为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()然后在文本编辑器中将其打开并获得它如何构建和扩展的想法..