带定时器的数据网格 [英] Data Grids With a Timer

查看:77
本文介绍了带定时器的数据网格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好


是否可以通过计时器将不同的数据文件加载到数据网格中?例如,我有两张电子表格。我想加载第一张电子表格并让它在那里停留约5秒左右。然后在那5秒后,我希望第二个
电子表格加载代替第一个。这可能与1个数据网格有关,还是需要多个?



感谢任何建议



解决方案

您好,


这远非完美。在这种情况下,我正在读一个Excel文件,每五秒显示一个工作表。


后端

使用System; 
使用System.Collections.Generic;
使用System.Data;
使用System.Data.OleDb;
使用System.IO;
使用System.Linq;

命名空间ExcelDemo_cs
{
公共类操作
{
私有字符串FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory," SampleDataForPost.xlsx" );
public List< string> SheetNames = new List< string>();
public Operations()
{
GetSheetNames();
}
public void GetSheetNames()
{
using(OleDbConnection cn = new OleDbConnection {ConnectionString = ConnectionString(FileName," No")})
{
cn.Open();
DataTable Sheets = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null);
SheetNames = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,null).AsEnumerable()。Select(row => row.Field< string>(" TABLE_NAME"))。ToList();
}

}
public string ConnectionString(string FileName,string Header)
{
OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder();
if(Path.GetExtension(FileName).ToUpper()==" .XLS")
{
Builder.Provider =" Microsoft.Jet.OLEDB.4.0" ;;
Builder.Add(" Extended Properties",string.Format(" Excel 8.0; IMEX = 1; HDR = {0};",Header));
}
else
{
Builder.Provider =" Microsoft.ACE.OLEDB.12.0" ;;
Builder.Add(" Extended Properties",string.Format(" Excel 12.0; IMEX = 1; HDR = {0};",Header));
}

Builder.DataSource = FileName;

返回Builder.ConnectionString;
}
public DataTable LoadSheet(string SheetName)
{
DataTable dt = new DataTable();
using(OleDbConnection cn = new OleDbConnection {ConnectionString = ConnectionString(FileName," No")})
{
cn.Open();

使用(OleDbCommand cmd = new OleDbCommand {CommandText =


" SELECT * FROM [{SheetName}]",Connection = cn})
{
OleDbDataReader dr = cmd.ExecuteReader();
dt.Load(dr);
}

返回dt;
}

}

}
}

前端代码

使用System; 
使用System.Threading.Tasks;
使用System.Windows.Forms;

命名空间ExcelDemo_cs
{
公共部分类Form1:表格
{
操作ops = new Operations();
static System.Timers.Timer aTimer;

void SetTimer()
{
aTimer = new System.Timers.Timer(10);
aTimer.Elapsed + = async(sender,e)=>等待HandleTimer();
aTimer.AutoReset = true;
aTimer.Enabled = true;
}
异步任务< int> HandleTimer()
{
aTimer.Stop();
for(int sheetIndex = 0; sheetIndex< ops.SheetNames.Count; sheetIndex ++)
{
if(dataGridView1.InvokeRequired)
{
dataGridView1.Invoke(新的MethodInvoker(
委托
{
dataGridView1.DataSource = ops.LoadSheet(ops.SheetNames [sheetIndex]);
}));

await Task.Delay(5000);
}
}

aTimer.Dispose();
返回0;
}
public Form1()
{
InitializeComponent();
显示+ = Form1_Shown;
}
private void Form1_Shown(object sender,EventArgs e)
{
SetTimer();
}
}
}


当然要做多个文件,你需要逻辑才能做到这一点。无论如何要考虑但不符合您的全部要求。




Hi Everyone

Is it possible to load different files of data into a data grid via timer? For example I have two spread sheets. I want to load in the first spread sheet and have it stay there for about 5 seconds or so. Then after those 5 seconds I would like the second spreadsheet to load in place of the first. Is this possible to do with 1 data grid or do I need multiple ones?

Thanks For Any Advice

解决方案

Hello,

This is far from perfect. In this case I'm reading one Excel file, each five seconds shows a WorkSheet.

Backend

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;

namespace ExcelDemo_cs
{
    public class Operations
    {
        private string FileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SampleDataForPost.xlsx");
        public List<string> SheetNames = new List<string>();
        public Operations()
        {
            GetSheetNames();
        }
        public void GetSheetNames()
        {
            using (OleDbConnection cn = new OleDbConnection { ConnectionString = ConnectionString(FileName, "No") })
            {
                cn.Open();
                DataTable Sheets = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                SheetNames = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).AsEnumerable().Select(row => row.Field<string>("TABLE_NAME")).ToList();
            }

        }
        public string ConnectionString(string FileName, string Header)
        {
            OleDbConnectionStringBuilder Builder = new OleDbConnectionStringBuilder();
            if (Path.GetExtension(FileName).ToUpper() == ".XLS")
            {
                Builder.Provider = "Microsoft.Jet.OLEDB.4.0";
                Builder.Add("Extended Properties", string.Format("Excel 8.0;IMEX=1;HDR={0};", Header));
            }
            else
            {
                Builder.Provider = "Microsoft.ACE.OLEDB.12.0";
                Builder.Add("Extended Properties", string.Format("Excel 12.0;IMEX=1;HDR={0};", Header));
            }

            Builder.DataSource = FileName;

            return Builder.ConnectionString;
        }
        public DataTable LoadSheet(string SheetName)
        {
            DataTable dt = new DataTable();
            using (OleDbConnection cn = new OleDbConnection { ConnectionString = ConnectionString(FileName, "No") })
            {
                cn.Open();

                using (OleDbCommand cmd = new OleDbCommand { CommandText =


"SELECT * FROM [{SheetName}]", Connection = cn }) { OleDbDataReader dr = cmd.ExecuteReader(); dt.Load(dr); } return dt; } } } }

Front end code

using System;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ExcelDemo_cs
{
    public partial class Form1 : Form
    {
        Operations ops = new Operations();
        static System.Timers.Timer aTimer;

        void SetTimer()
        {
            aTimer = new System.Timers.Timer(10);
            aTimer.Elapsed += async (sender, e) => await HandleTimer();
            aTimer.AutoReset = true;
            aTimer.Enabled = true;
        }
        async Task<int> HandleTimer()
        {
            aTimer.Stop();
            for (int sheetIndex = 0; sheetIndex < ops.SheetNames.Count; sheetIndex++)
            {
                if (dataGridView1.InvokeRequired)
                {
                    dataGridView1.Invoke(new MethodInvoker(
                        delegate 
                        {
                            dataGridView1.DataSource = ops.LoadSheet(ops.SheetNames[sheetIndex]);
                        }));

                    await Task.Delay(5000);
                }
            }

            aTimer.Dispose();
            return 0;
        }
        public Form1()
        {
            InitializeComponent();
            Shown += Form1_Shown;
        }
         private void Form1_Shown(object sender, EventArgs e)
        {
            SetTimer();
        }
    }
}

Of course to do multiple files you need logic on top of the above to do that. Anyways something to consider but does not meet your full requirements.


这篇关于带定时器的数据网格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆