Похоже, вы просто обновляете столбец каждую секунду. Возможно, будет более эффективным сделать datatable свойством формы и обновлять его каждую секунду (т. Е. Не нужно переустанавливать источник данных в сетке ... это может вызывать проблемы, так как много события, когда вы это делаете).
Согласно моему комментарию, похоже, что вам нужно перезагрузить данные только при возникновении события наблюдателя файловой системы, и это должен быть единственный раз, когда вы повторно привязываетесь к своей сетке.
В ответ на ваш комментарий ваш код должен выглядеть примерно так:
namespace XML
{
public partial class Form1 : Form
{
DataSet formBindingSource = null;
public Form1()
{
InitializeComponent();
this.timer1.Enabled = true;
this.timer1.Interval = 1000;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
FileSystemWatcher incoming = new FileSystemWatcher();
incoming.Path = @"c:\";
incoming.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.FileName;
incoming.Filter = "sites.xml";
incoming.Changed += new FileSystemEventHandler(OnChanged);
incoming.EnableRaisingEvents = true;
}
public void OnChanged(object source, FileSystemEventArgs e)
{
formBindingSource = new DataSet();
using(FileStream stream1 = new FileStream("c:\\sites.xml", FileMode.Open))
{
ds.ReadXml(stream1);
}
this.UpdateDataGrid();
dataGridView1.DataSource = formBindingSource.Tables[0];
}
public void UpdateDataGrid()
{
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate { UpdateDataGrid(); });
}
else
{
//refresh column status evry second
int count = 0;
foreach (DataRow dr in formBindingSource.Tables[0].Rows)
{
DateTime SystemTime = Convert.ToDateTime(DateTime.Now);
DateTime StartTime = Convert.ToDateTime(dr[0]);
DateTime EndTime = Convert.ToDateTime(dr[1]);
if (StartTime.TimeOfDay.Ticks <= SystemTime.TimeOfDay.Ticks && SystemTime.TimeOfDay.Ticks < EndTime.TimeOfDay.Ticks)
{
ds.Tables[0].Rows[count][5] = "ok";
}
else
{
ds.Tables[0].Rows[count][5] = "nok";
}
count++;
}
formBindingSource.Tables[0].DefaultView.RowFilter = "date = #" + DateTime.Today + "#";
}
}
private void Form1_Load(object sender, EventArgs e)
{
//Load and bind file
OnChanged(null,null)
}
private void timer1_Tick(object sender, EventArgs e)
{
this.UpdateDataGrid();
this.label1.Text = DateTime.Now.ToString("dddd, MMMM dd, yyyy hh:mm:ss tt");
}
}
}
Обратите внимание, что существует набор данных уровня формы с именем formBindingSource. Когда вы обновляете это приложение, оно должно обновляться автоматически, без необходимости сбрасывать источник данных для сетки. Вам необходимо выполнить повторную привязку только после изменения файла и загрузки нового набора данных.
(Кроме того, проще использовать оператор using
в коде вашего файлового потока, чем то, что вы сделали)