winform中timer定时执行事件,gridview不刷新,求解,在线等

_zhangc 2017-07-14 01:21:39
myTimer = new System.Timers.Timer(timerCycle);//设置Timer周期
myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed); //Timer执行事件
myTimer.AutoReset = true; //是否不断重复定时器操作
myTimer.Enabled = true;//定时器开始用
myTimer.Start(); //定时器开始



void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{

//待执行集合中超过当前时间(自动开启或者关闭)
DataTable mToBeComplete = null;

if (dtToBeComplete != null && dtToBeComplete.Rows.Count > 0)
{


if (mToBeComplete == null)
{
mToBeComplete = new DataTable();
mToBeComplete.Columns.Add(TaskObject.TaskName, typeof(string));
mToBeComplete.Columns.Add(TaskObject.TaskType, typeof(int));
mToBeComplete.Columns.Add(TaskObject.TaskTime, typeof(DateTime));
mToBeComplete.Columns.Add(TaskObject.TaskAddress, typeof(string));
mToBeComplete.Columns.Add(TaskObject.TaskParamPID, typeof(string));


}

foreach (DataRow item in dtToBeComplete.Rows)
{

if (Convert.ToDateTime(item[TaskObject.TaskTime]) <= DateTime.Now)
{

DataRow dr = mToBeComplete.NewRow();
dr[TaskObject.TaskName] = item[TaskObject.TaskName];
dr[TaskObject.TaskType] = Convert.ToInt32(item[TaskObject.TaskType]);
dr[TaskObject.TaskTime] = Convert.ToDateTime(item[TaskObject.TaskTime]);
dr[TaskObject.TaskAddress] = item[TaskObject.TaskAddress];
dr[TaskObject.TaskParamPID] = item[TaskObject.TaskParamPID];

mToBeComplete.Rows.Add(dr);


}
}
}

if (mToBeComplete != null && mToBeComplete.Rows.Count > 0)
{

for (int i = 0; i < mToBeComplete.Rows.Count; i++)
{

if (mToBeComplete != null && mToBeComplete.Rows.Count > 0)
{
DataRow row = mToBeComplete.Rows[i];

int taskType = Convert.ToInt32(row["TaskType"]);


if (taskType == 1)//启动
{
StartProgram(row["TaskAddress"].ToString(), row["TaskParamPID"].ToString());
}
else//关闭
{
KillProgram(Convert.ToInt32(row["TaskParamPID"]));
}


//删除待执行中已经执行的
dtToBeComplete.Rows.RemoveAt(i);


DataRow drNew = dtComplete.NewRow();

drNew[TaskObject.TaskName] = row[TaskObject.TaskName];
drNew[TaskObject.TaskType] = Convert.ToInt32(row[TaskObject.TaskType]);
drNew[TaskObject.TaskTime] = Convert.ToDateTime(row[TaskObject.TaskTime]);
drNew[TaskObject.TaskAddress] = row[TaskObject.TaskAddress];
drNew[TaskObject.TaskParamPID] = row[TaskObject.TaskParamPID];


//添加到已执行
dtComplete.Rows.Add(drNew);

// DgvToBeComplete.Refresh();
// DgvComplete.Refresh();
}
}

}
}
catch (Exception ex)
{
MessageBox.Show("执行任务异常!" + ex);

return;
}




}
...全文
929 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
whzh719 2017-09-28
  • 打赏
  • 举报
回复
myTimer_Elapsed 事件早后一行,加刷新 datagrid 功能 ,就可以
班门弄武 2017-07-14
  • 打赏
  • 举报
回复
不需要重新赋值,只要绑定的还是原来的DataTable。


xdashewan 2017-07-14
  • 打赏
  • 举报
回复
引用 8 楼 u011690009 的回复:
5楼就是我发的整个页面代码
断点确定是否执行到remove和add
_zhangc 2017-07-14
  • 打赏
  • 举报
回复
[quote=引用 7 楼 xdashewan 的回复:]5楼就是我发的整个页面代码
xdashewan 2017-07-14
  • 打赏
  • 举报
回复
引用 4 楼 u011690009 的回复:
这些都是里面都是有值的就是gridview不刷新
要么自己调试,要么把代码发全,不然无法判断
exception92 2017-07-14
  • 打赏
  • 举报
回复
引用 3 楼 u011690009 的回复:
引用 1 楼 duanzi_peng 的回复:
都没有绑定到gridview的DataSource源上,怎么会刷新。
加载里面有 DgvToBeComplete.DataSource = dtToBeComplete;绑定
我是说 myTimer_Elapsed 事件里没有。 DataTable的改变不同通知到UI,得手动再赋值一次。
_zhangc 2017-07-14
  • 打赏
  • 举报
回复
using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Timers; using System.Windows.Forms; namespace WF_StartStopPro { public partial class FrmStartStopPro : Form { public FrmStartStopPro() { InitializeComponent(); } //新建定时器 System.Timers.Timer myTimer; //待完成任务 DataTable dtToBeComplete = null; //已完成任务 DataTable dtComplete = null; /// <summary> /// 窗体加载 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FrmStartStopPro_Load(object sender, EventArgs e) { //禁止窗体最大化 MaximizeBox = false; //加载任务类型 LoadTaskType(); //默认选开启 CboTaskType.SelectedIndex = 0; //获取配置定时周期 double timerCycle = double.Parse(ConfigurationManager.AppSettings["TimerCycle"].ToString()); myTimer = new System.Timers.Timer(timerCycle);//设置Timer周期 myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed); //Timer执行事件 myTimer.AutoReset = true; //是否不断重复定时器操作 myTimer.Enabled = true;//定时器开始用 myTimer.Start(); //定时器开始 TxtTaskName.Text = "计划任务"; if (dtToBeComplete == null) { dtToBeComplete = new DataTable(); dtToBeComplete.Columns.Add(TaskObject.TaskName, typeof(string)); dtToBeComplete.Columns.Add(TaskObject.TaskType, typeof(int)); dtToBeComplete.Columns.Add(TaskObject.TaskTime, typeof(DateTime)); dtToBeComplete.Columns.Add(TaskObject.TaskAddress, typeof(string)); dtToBeComplete.Columns.Add(TaskObject.TaskParamPID, typeof(string)); } DgvToBeComplete.DataSource = dtToBeComplete; if (dtComplete == null) { dtComplete = new DataTable(); dtComplete.Columns.Add(TaskObject.TaskName, typeof(string)); dtComplete.Columns.Add(TaskObject.TaskType, typeof(int)); dtComplete.Columns.Add(TaskObject.TaskTime, typeof(DateTime)); dtComplete.Columns.Add(TaskObject.TaskAddress, typeof(string)); dtComplete.Columns.Add(TaskObject.TaskParamPID, typeof(string)); } DgvComplete.DataSource = dtComplete; } void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { try { //待执行集合中超过当前时间(自动开启或者关闭) DataTable mToBeComplete = null; if (dtToBeComplete != null && dtToBeComplete.Rows.Count > 0) { if (mToBeComplete == null) { mToBeComplete = new DataTable(); mToBeComplete.Columns.Add(TaskObject.TaskName, typeof(string)); mToBeComplete.Columns.Add(TaskObject.TaskType, typeof(int)); mToBeComplete.Columns.Add(TaskObject.TaskTime, typeof(DateTime)); mToBeComplete.Columns.Add(TaskObject.TaskAddress, typeof(string)); mToBeComplete.Columns.Add(TaskObject.TaskParamPID, typeof(string)); } foreach (DataRow item in dtToBeComplete.Rows) { if (Convert.ToDateTime(item[TaskObject.TaskTime]) <= DateTime.Now) { DataRow dr = mToBeComplete.NewRow(); dr[TaskObject.TaskName] = item[TaskObject.TaskName]; dr[TaskObject.TaskType] = Convert.ToInt32(item[TaskObject.TaskType]); dr[TaskObject.TaskTime] = Convert.ToDateTime(item[TaskObject.TaskTime]); dr[TaskObject.TaskAddress] = item[TaskObject.TaskAddress]; dr[TaskObject.TaskParamPID] = item[TaskObject.TaskParamPID]; mToBeComplete.Rows.Add(dr); } } } if (mToBeComplete != null && mToBeComplete.Rows.Count > 0) { for (int i = 0; i < mToBeComplete.Rows.Count; i++) { if (mToBeComplete != null && mToBeComplete.Rows.Count > 0) { DataRow row = mToBeComplete.Rows[i]; int taskType = Convert.ToInt32(row["TaskType"]); if (taskType == 1)//启动 { StartProgram(row["TaskAddress"].ToString(), row["TaskParamPID"].ToString()); } else//关闭 { KillProgram(Convert.ToInt32(row["TaskParamPID"])); } //删除待执行中已经执行的 dtToBeComplete.Rows.RemoveAt(i); DataRow drNew = dtComplete.NewRow(); drNew[TaskObject.TaskName] = row[TaskObject.TaskName]; drNew[TaskObject.TaskType] = Convert.ToInt32(row[TaskObject.TaskType]); drNew[TaskObject.TaskTime] = Convert.ToDateTime(row[TaskObject.TaskTime]); drNew[TaskObject.TaskAddress] = row[TaskObject.TaskAddress]; drNew[TaskObject.TaskParamPID] = row[TaskObject.TaskParamPID]; //添加到已执行 dtComplete.Rows.Add(drNew); // DgvToBeComplete.Refresh(); // DgvComplete.Refresh(); } } } } catch (Exception ex) { MessageBox.Show("执行任务异常!" + ex); return; } } /// <summary> /// 点击配置按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnTaskConfig_Click(object sender, EventArgs e) { try { int taskType; GetTaskType(out taskType); string taskName = TxtTaskName.Text; DataRow row = dtToBeComplete.NewRow(); row[TaskObject.TaskName] = taskName; row[TaskObject.TaskType] = taskType; row[TaskObject.TaskTime] = Convert.ToDateTime(TxtTaskTime.Text); row[TaskObject.TaskAddress] = TxtTaskAddress.Text; row[TaskObject.TaskParamPID] = TxtTaskParamPID.Text; //待执行列表是否存在相同名称 var list = dtToBeComplete.AsEnumerable().Where(p => p.Field<string>("TaskName") == taskName).ToList(); if (list.Count > 0) { MessageBox.Show("待执行任务名称已存在!"); return; } else { dtToBeComplete.Rows.Add(row); } } catch (Exception ex) { MessageBox.Show("添加配置异常!" + ex); } } private void GetTaskType(out int taskType) { taskType = -1; string mtaskType = CboTaskType.SelectedItem.ToString(); if (mtaskType == "开启") { taskType = 1; } else if (mtaskType == "关闭") { taskType = 0; } } /// <summary> /// 启动应用程序 /// </summary> /// <param name="taskAddress"></param> private void StartProgram(string taskAddress, string taskParamPID) { try { Process.Start(taskAddress, taskParamPID); //int lastIndex = taskAddress.LastIndexOf('\\'); //string fileName = taskAddress.Substring(lastIndex + 1, taskAddress.Length - lastIndex - 5); //Process p = new Process(); //p.StartInfo.WorkingDirectory = taskAddress; //要启动程序路径 //p.StartInfo.FileName = fileName;//需要启动的程序名 //p.StartInfo.Arguments = taskParamPID;//传递的参数 //p.Start();//启动 } catch (Exception ex) { MessageBox.Show("启动应用程序异常!" + ex); } } /// <summary> /// 关闭应用程序 /// </summary> /// <param name="PID"></param> private void KillProgram(int PID) { try { //通过进程ID,找到进程 Process process = Process.GetProcessById(PID); //Kill 进程 process.Kill(); } catch (Exception ex) { MessageBox.Show("关闭应用程序异常!" + ex); } } } }
_zhangc 2017-07-14
  • 打赏
  • 举报
回复
引用 2 楼 xdashewan 的回复:
你随便mToBeComplete = new DataTable();为何gridview要有反映
这些都是里面都是有值的就是gridview不刷新
_zhangc 2017-07-14
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
都没有绑定到gridview的DataSource源上,怎么会刷新。
加载里面有 DgvToBeComplete.DataSource = dtToBeComplete;绑定
xdashewan 2017-07-14
  • 打赏
  • 举报
回复
你随便mToBeComplete = new DataTable();为何gridview要有反映
exception92 2017-07-14
  • 打赏
  • 举报
回复
都没有绑定到gridview的DataSource源上,怎么会刷新。

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧