带定时器的数据网格 [英] Data Grids With a Timer
问题描述
大家好
是否可以通过计时器将不同的数据文件加载到数据网格中?例如,我有两张电子表格。我想加载第一张电子表格并让它在那里停留约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屋!