读取 XML 个文件以在 DataGridView 中显示数据,并在使用 C# 更改 XML 文件时自动更新 UI
Read XML files to display data in DataGridView and update UI automatically if XML file is changed using C#
我正在尝试读取一个目录中存在的多个 XML 文件(每个 XML 只有一条记录)并在 DataGridView 中显示这些记录。我想如果 XML 文件中的任何一个更新了新数据,其相应的条目应该自动 updated/refreshed 与 DataGridView 中的新更新数据。在做了一些搜索后,我发现我可以使用 FileSystemWatcher 来查找是否有任何文件被更改,但是任何人都可以帮助我如何使用它,我找不到一个好的例子。
我的 XML 文件看起来像(请注意其中没有根节点):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<info>
<id>001</id>
<name>xyz</name>
<salary>1000</salary>
<phone>1234567890</phone>
</info>
我读取 XML 和填充 gridview 的 C# 代码如下:
using System.Xml;
using System.IO;
namespace XML_Reader
{
public partial class Form1 : Form
{
string[] fileArray;
string directory_path = "C:\Users\XYZ\Desktop\test\";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Add columns to empty datagridview
dataGridView1.Columns.Add("id", "id");
dataGridView1.Columns.Add("name", "name");
dataGridView1.Columns.Add("salary", "salary");
dataGridView1.Columns.Add("phone", "phone");
populateRecords();
}
private void populateRecords()
{
DataSet ds;
DataGridViewRow dg_row;
//Read all XML files and records to datagrid
fileArray = Directory.GetFiles(directory_path, "MyFiles*.xml");
foreach (string xmlFile in fileArray_collection)
{
//Read the XML from the file
ds = new DataSet();
ds.ReadXml(xmlFile);
//create new row for datagrid
dg_row = (DataGridViewRow)dataGridView1.Rows[0].Clone();
//assign values to cells in the new row
dg_row.Cells[0].Value = ds.Tables["info"].Rows[0]["id"];
dg_row.Cells[1].Value = ds.Tables["info"].Rows[0]["name"];
dg_row.Cells[2].Value = ds.Tables["info"].Rows[0]["salary"];
dg_row.Cells[3].Value = ds.Tables["info"].Rows[0]["phone"];
//Add the new row to datagrid -- THE MOMENT RECORD IS DETECTED
dataGridView1.Rows.Add(dg_row);
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1;//This will keep the last added row visible with vertical scrollbar being at bottom.
}
}
}
}
您必须在 class 文件中实施 FileSystemWatcher
。
new System.IO.FileSystemWatcher m_Watcher = new System.IO.FileSystemWatcher();
然后我们需要给它分配一个路径和一个过滤器来告诉对象继续寻找的地方。
m_Watcher.Path = "folder path";
接下来我们需要告诉观察者要看什么。
m_Watcher.Filter = strFilter;
strFilter 应该是:
*.* - Watch all files in the Path
*.ext - Watch files with the extension ext
name.ext - Watch a particular file name.ext
接下来我们需要告诉观察者要寻找什么。
m_Watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.FileName |
NotifyFilters.DirectoryName;
m_Watcher.IncludeSubdirectories = true;
接下来我们需要描述当这些属性之一被改变时需要做什么。
m_Watcher.Changed += new FileSystemEventHandler(OnChanged);
m_Watcher.Created += new FileSystemEventHandler(OnChanged);
m_Watcher.Deleted += new FileSystemEventHandler(OnChanged);
m_Watcher.Renamed += new RenamedEventHandler(OnRenamed);
void OnChanged(object sender, FileSystemEventArgs e)
void OnRenamed(object sender, RenamedEventArgs e)
**最后,我们需要告诉 watcher 做它的工作 - Watch It!!! **
m_Watcher.EnableRaisingEvents = true;
您可以使用提到的link。
FileWatcher
我正在尝试读取一个目录中存在的多个 XML 文件(每个 XML 只有一条记录)并在 DataGridView 中显示这些记录。我想如果 XML 文件中的任何一个更新了新数据,其相应的条目应该自动 updated/refreshed 与 DataGridView 中的新更新数据。在做了一些搜索后,我发现我可以使用 FileSystemWatcher 来查找是否有任何文件被更改,但是任何人都可以帮助我如何使用它,我找不到一个好的例子。
我的 XML 文件看起来像(请注意其中没有根节点):
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<info>
<id>001</id>
<name>xyz</name>
<salary>1000</salary>
<phone>1234567890</phone>
</info>
我读取 XML 和填充 gridview 的 C# 代码如下:
using System.Xml;
using System.IO;
namespace XML_Reader
{
public partial class Form1 : Form
{
string[] fileArray;
string directory_path = "C:\Users\XYZ\Desktop\test\";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Add columns to empty datagridview
dataGridView1.Columns.Add("id", "id");
dataGridView1.Columns.Add("name", "name");
dataGridView1.Columns.Add("salary", "salary");
dataGridView1.Columns.Add("phone", "phone");
populateRecords();
}
private void populateRecords()
{
DataSet ds;
DataGridViewRow dg_row;
//Read all XML files and records to datagrid
fileArray = Directory.GetFiles(directory_path, "MyFiles*.xml");
foreach (string xmlFile in fileArray_collection)
{
//Read the XML from the file
ds = new DataSet();
ds.ReadXml(xmlFile);
//create new row for datagrid
dg_row = (DataGridViewRow)dataGridView1.Rows[0].Clone();
//assign values to cells in the new row
dg_row.Cells[0].Value = ds.Tables["info"].Rows[0]["id"];
dg_row.Cells[1].Value = ds.Tables["info"].Rows[0]["name"];
dg_row.Cells[2].Value = ds.Tables["info"].Rows[0]["salary"];
dg_row.Cells[3].Value = ds.Tables["info"].Rows[0]["phone"];
//Add the new row to datagrid -- THE MOMENT RECORD IS DETECTED
dataGridView1.Rows.Add(dg_row);
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1;//This will keep the last added row visible with vertical scrollbar being at bottom.
}
}
}
}
您必须在 class 文件中实施 FileSystemWatcher
。
new System.IO.FileSystemWatcher m_Watcher = new System.IO.FileSystemWatcher();
然后我们需要给它分配一个路径和一个过滤器来告诉对象继续寻找的地方。
m_Watcher.Path = "folder path";
接下来我们需要告诉观察者要看什么。
m_Watcher.Filter = strFilter;
strFilter 应该是:
*.* - Watch all files in the Path
*.ext - Watch files with the extension ext
name.ext - Watch a particular file name.ext
接下来我们需要告诉观察者要寻找什么。
m_Watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.FileName |
NotifyFilters.DirectoryName;
m_Watcher.IncludeSubdirectories = true;
接下来我们需要描述当这些属性之一被改变时需要做什么。
m_Watcher.Changed += new FileSystemEventHandler(OnChanged);
m_Watcher.Created += new FileSystemEventHandler(OnChanged);
m_Watcher.Deleted += new FileSystemEventHandler(OnChanged);
m_Watcher.Renamed += new RenamedEventHandler(OnRenamed);
void OnChanged(object sender, FileSystemEventArgs e)
void OnRenamed(object sender, RenamedEventArgs e)
**最后,我们需要告诉 watcher 做它的工作 - Watch It!!! **
m_Watcher.EnableRaisingEvents = true;
您可以使用提到的link。 FileWatcher