【发布时间】:2020-12-03 21:15:09
【问题描述】:
我正在尝试使用文本框和 datagridview 创建一个“仪表板”表单。加载到其中的数据来自每 10 分钟更新一次的 Excel 电子表格。我添加了一个计时器来刷新数据,但无法更新表单上的文本框和 datagridview。我可以告诉计时器正在工作,因为如果我向下滚动到 datagridview 的底部,表单将会更新。我错过了什么?
public AllOrders()
{
InitializeComponent();
System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
timer1.Interval = 10000;
timer1.Tick += new System.EventHandler(timer1_Tick);
timer1.Enabled = true;
timer1.Start();
Get_Data();
}
private void Get_Data()
{
// connect to get file
string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='\\\\xxxxx\\labdash.xls';Extended Properties=\"Excel 8.0;HDR=Yes\";";
OleDbConnection MyConnection = new OleDbConnection(ConnectionString);
// select only worksheet in spreadsheet
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter("select * from [Sheet1$]", MyConnection);
// define dataset as entire spreadsheet
DataSet ds = new DataSet();
myDataAdapter.Fill(ds);
// define view to set filters, restrictions, etc
DataView dv;
dv = new DataView(ds.Tables[0], "ordept = 'CHE'", "ordept", DataViewRowState.CurrentRows);
dataGridView1.DataSource = dv;
// define header information
ctr = dataGridView1.Rows.Count;
textBox1.Text = ctr.ToString() + " outstanding tests";
upddte = dataGridView1.Rows[1].Cells[14].Value.ToString();
updtim = dataGridView1.Rows[1].Cells[15].Value.ToString();
textBox2.Text = upddte.Substring(5, 2) + " last updated";
// hide columns not needed
dataGridView1.Columns[0].Visible = false;
dataGridView1.Columns[4].Visible = false;
dataGridView1.Columns[5].Visible = false;
dataGridView1.Columns[6].Visible = false;
dataGridView1.Columns[9].Visible = false;
dataGridView1.Columns[10].Visible = false;
dataGridView1.Columns[11].Visible = false;
dataGridView1.Columns[14].Visible = false;
dataGridView1.Columns[15].Visible = false;
dataGridView1.Columns[17].Visible = false;
// sort by priority, specimen date, specimen time
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);
dataGridView1.Sort(dataGridView1.Columns[13], ListSortDirection.Ascending);
dataGridView1.Sort(dataGridView1.Columns[14], ListSortDirection.Ascending);
// change font color for certain status'
dataGridView1.RowPrePaint
+= new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(dataGridView1_RowPrePaint);
dataGridView1.Update();
dataGridView1.Refresh();
textBox1.Update();
textBox1.Refresh();
textBox2.Update();
textBox2.Refresh();
}
private void timer1_Tick(object sender, EventArgs e)
{
Get_Data();
}
【问题讨论】:
-
您应该将计时器添加到表单本身。目前,您仅将其作为构造函数中的局部变量,因此它可能随时被垃圾收集器销毁。
-
我认为从 Visual Studio 工具箱添加计时器就是将其添加到表单本身。我错了吗?
标签: c# winforms datagridview timer