тикер и набор данных - PullRequest
       0

тикер и набор данных

0 голосов
/ 12 января 2012

Я изменил код, но у меня все еще проблемы, все нормально. За исключением случаев, когда я изменяю данные в файл XML, происходит сбой приложения. Должно быть обновлено представление данных, когда я изменяю данные в XML-файл.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Threading;
using System.Reflection;

namespace XML
{
    public partial class Form1 : Form
    {

        DataSet formBindingSource = null;

        public Form1()
        {
            InitializeComponent();

            //
            formBindingSource = new DataSet();
            using (FileStream stream1 = new FileStream("c:\\sites.xml", FileMode.Open))
            {
                formBindingSource.ReadXml(stream1);
            }
            this.UpdateDataGrid();
            dataGridView1.DataSource = formBindingSource.Tables[0];
            //
            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)
        {

            using (FileStream stream1 = new FileStream("c:\\sites.xml", FileMode.Open))
            {
                formBindingSource.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)
                    {
                        formBindingSource.Tables[0].Rows[count][5] = "ok";

                    }

                    else
                    {
                        formBindingSource.Tables[0].Rows[count][5] = "nok";

                    }

                    count++;

                }
                formBindingSource.Tables[0].DefaultView.RowFilter = "date = #" + DateTime.Today + "#";

            }
        }



        private void timer1_Tick(object sender, EventArgs e)
        {




            this.UpdateDataGrid();

            this.label1.Text = DateTime.Now.ToString("dddd, MMMM dd, yyyy                   hh:mm:ss tt");
        }


    }
}  

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Похоже, вы просто обновляете столбец каждую секунду. Возможно, будет более эффективным сделать 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 в коде вашего файлового потока, чем то, что вы сделали)

0 голосов
/ 12 января 2012

Я думаю, что здесь может быть проблема, потому что вы меняете источник данных DataGridView в цикле for, что не является лучшим способом:

foreach (DataRow dr in ds.Tables[0].Rows)
{
     String StartCourse = dr[0].ToString();
     string EndCourse = dr[1].ToString();
     DateTime SystemTime = Convert.ToDateTime(DateTime.Now);
     DateTime StartTime = Convert.ToDateTime(StartCourse);
     DateTime EndTime = Convert.ToDateTime(EndCourse);

     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++;
     //dataGridView1.DataSource = ds.Tables[0];   <- HERE COULD BE THE PROBLEM

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...