winform程序,调用多个timer1 画面顿卡

qq_36198178 2017-05-08 05:38:46
大家好,我又来了。其实很不好意思,因为感觉自己弄了两个多月,还是啥都不会一样。
但各种尝试后,实在没辙了,只能来这里求助了。
容我先描述下我要做的东西:
一个winform界面,主要考虑两部分:
1.车(图片)的移动。
2.实时的从数据库中读取信息(每50ms读一次,并与上一次的数据比较,若不同,则在界面上的label显示相关的内容)

所以我的想法是设置三个timer1:
timer1:控制车的移动(我用的是改变图片坐标的方法,像这样:this.pictureBox1.Left -= 10;)
timer2:从数据库中读取表1的一个id,并判断如果id与上次的不一样,则表示可以读其他表里的数据。
timer3:读取数据库中其他的表(每50ms读一次),并判断如果与上次读的值不一样,就输出到界面里。

问题是:当我加了读数据库的timer后,画面就变的顿卡,效果如下:
只有timer1的时候:(此时图片移动很流畅)



————————————分割线————————————————————
————————————分割线————————————————————
————————————分割线————————————————————
————————————分割线————————————————————


加了timer3之后:(顿卡)


我自己想过的解决办法有:
将timer3换成异步定时器,但是读数据库的时候总是出错,一会说和DataReader已关闭需要打开,一会说Datareader已打开需要关闭。我猜的原因是主线程里也有读取数据库的数据,二者是不是串了,但也不知道怎么办,最终没能解决。
我咨询老师的办法:
老师说我移动图片的思路有问题,让我用Graphics重绘+双缓冲的方法移动图片。我试着弄了下,但想不出来怎么用这种方法移动图片。

我现在是在继续想用Graphics重绘的方法如何循环移动图片,但我不知道这种方法能不能最终解决问题。
所以我想来这里求助大家,大家有什么办法吗?

...全文
1348 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36198178 2017-05-10
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
我同意你的这个观点,你并没有找到问题的原因 之前我跟踪过你的这个项目,并留有动画不凡的代码。但在其中加上另外的定时器后,对动画没有任何影响,至少肉眼是看不出来的 其实 Forms.Timer.Tick 的响应程序是在子线程中运行的,因此他不会,也不应该影响另一个 Forms.Timer.Tick 的行为
终于算是解决了 我还是用了一个异步定时器 并把数据库查询语句都给修正了下 谢了啊 版主!
qq_36198178 2017-05-10
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
50 ms 进行一次数据库查询自然是很卡。有的人以为程序中只会有这样一、两个轮询,那是因为它很少评估别人的程序。 我们稍不留神,就会被一些实习生在系统里偷偷地扔进去什么“50ms 定时器”代码。实际上一看到程序突然某天变卡了,就会赶紧去检查有没有人偷偷植入什么定时器代码。所以这时候这种 timer 代码就不仅仅是你自己“玩儿”一个小例子的问题,而是整个的程序设计的事件驱动设计知识问题,代表着某些人对于涉及到事件驱动的部分可能完全不理解、完全不去进行设计。
终于算是解决了 我还是用了一个异步定时器 并把数据库查询语句都给修正了下 谢了啊 兄弟!
qq_36198178 2017-05-10
  • 打赏
  • 举报
回复
引用 19 楼 baidu_27549073 的回复:
[quote=引用 6 楼 qq_36198178 的回复:] [quote=引用 3 楼 sp1234 的回复:] 如果确实是定时执行什么操作,那么以定时器 Timer 驱动是正常的、正规的。 但是有的人不懂事件驱动的道理,用多个 timer 来模拟事件驱动,这就往往是搞砸了系统的顺畅性能。系统中不管是属性值改变,还是数据发送或者接收(I/O),或者是用户交互操作了一下子,等等,都是事件驱动的。这个设计技术和概念,远比你这整个项目还重要。 至于说你的 timer2、timer3 应该合并的流程,其实就是类似
var x = 查询最新id();
if(x != 旧的id)
{
    旧的id = x;
    ThreadPool.QueueUserWorkItem(h => 读取第1个数据库并且处理());
    ThreadPool.QueueUserWorkItem(h => 读取第2个数据库并且处理());
    ThreadPool.QueueUserWorkItem(h => 读取第3个数据库并且处理());
}
这样地异步、多线程地触发子任务,使得子任务能够并发执行。而不要见了什么并发任务又去想到 Timer。 你在事件驱动设计方面滥用 timer。在并发子任务方面滥用 timer。这两的问题都比较严重。
兄弟 首先很感谢您的回复。 虽然自己多线程、异步、数据库主动通知程序这些没听懂,主要是脑子里没货,但是觉得很受用,而且以后肯定用得着,目前我能一下子收获到的是: 1.确实 timer2 和 timer3可以合并成一个就行,这一点是我没想到,被你提醒,有一种恍然大悟的感觉。 但我试了下,将timer2和timer3合并到一个异步定时器里面,读数据库一直报错,我设置断点调试,一直在第一个数据库查询方法里乱跳,让我很搞不懂逻辑,不知道接下来怎么办。 我将异步timer里的代码,复制到timer2里(相当于我没有用异步定时器,而是用了两个timer控件:timer1控制图片移动,timer2控制读取数据库),则可以顺利读出数据,只是顿卡现象解决不了。 一样的程序,在异步定时器里却一直报异常。 我的第一个数据库查询方法是这样的:(主程序的异步定时器里,调用了一下这个方法,还没执行完,就异常了) public static void Query_data_whole(SqlConnection conn, out int x, out int y) { int temp1 = 0; int temp2 = 0; string str_drw_id = "select * from dbo.data_record_whole where drw_id in (select max(drw_id) from dbo.data_record_whole)"; if (conn != null) { SqlCommand comm = new SqlCommand(str_drw_id, conn); SqlDataReader myreader; myreader = comm.ExecuteReader(); while (myreader.Read()) { temp1 = Convert.ToInt32(myreader["drw_id"]); temp2 = Convert.ToInt32(myreader["ts_id"]); } if (!myreader.IsClosed) { myreader.Close(); } } x = temp1; y = temp2; } 然后我加断点调试,就一直在 int temp1 = 0;和myreader = comm.ExecuteReader();来回跳,直到最后报出这样的异常: “System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理 其他信息: ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为打开。 2.ThreadPool.QueueUserWorkItem(h => 读取第1个数据库并且处理()); 意思是在异步定时器里也可以这样来调用方法吗? 因为我对多线程这方面还没什么认识,所以如果要解决顿卡的问题,我当前是否最要紧的就是补一下多线程这方面的知识?[/quote] 1、你这个读数据库的频率太快了。下一次定时器开始时上一次还没执行完。到后面就堆到一起了。 2、对你现在来说简单有效的办法是加长时间 3、你设计的又问题,没有读一串数据,只有最后50ms的数据是不同的。这太浪费了,每次读最后50MS的,然后让客户端判断。 4、数据量会随着时间越来越大,所以也越来越慢[/quote] 恩 谢谢!我现在用了一个异步定时器 并修改了一些查询语句 这个问题解决了!
baidu_27549073 2017-05-10
  • 打赏
  • 举报
回复
3、你设计的又问题,没有读一串数据,---》你设计的又问题,每次读全部数据
baidu_27549073 2017-05-10
  • 打赏
  • 举报
回复
引用 6 楼 qq_36198178 的回复:
[quote=引用 3 楼 sp1234 的回复:] 如果确实是定时执行什么操作,那么以定时器 Timer 驱动是正常的、正规的。 但是有的人不懂事件驱动的道理,用多个 timer 来模拟事件驱动,这就往往是搞砸了系统的顺畅性能。系统中不管是属性值改变,还是数据发送或者接收(I/O),或者是用户交互操作了一下子,等等,都是事件驱动的。这个设计技术和概念,远比你这整个项目还重要。 至于说你的 timer2、timer3 应该合并的流程,其实就是类似
var x = 查询最新id();
if(x != 旧的id)
{
    旧的id = x;
    ThreadPool.QueueUserWorkItem(h => 读取第1个数据库并且处理());
    ThreadPool.QueueUserWorkItem(h => 读取第2个数据库并且处理());
    ThreadPool.QueueUserWorkItem(h => 读取第3个数据库并且处理());
}
这样地异步、多线程地触发子任务,使得子任务能够并发执行。而不要见了什么并发任务又去想到 Timer。 你在事件驱动设计方面滥用 timer。在并发子任务方面滥用 timer。这两的问题都比较严重。
兄弟 首先很感谢您的回复。 虽然自己多线程、异步、数据库主动通知程序这些没听懂,主要是脑子里没货,但是觉得很受用,而且以后肯定用得着,目前我能一下子收获到的是: 1.确实 timer2 和 timer3可以合并成一个就行,这一点是我没想到,被你提醒,有一种恍然大悟的感觉。 但我试了下,将timer2和timer3合并到一个异步定时器里面,读数据库一直报错,我设置断点调试,一直在第一个数据库查询方法里乱跳,让我很搞不懂逻辑,不知道接下来怎么办。 我将异步timer里的代码,复制到timer2里(相当于我没有用异步定时器,而是用了两个timer控件:timer1控制图片移动,timer2控制读取数据库),则可以顺利读出数据,只是顿卡现象解决不了。 一样的程序,在异步定时器里却一直报异常。 我的第一个数据库查询方法是这样的:(主程序的异步定时器里,调用了一下这个方法,还没执行完,就异常了) public static void Query_data_whole(SqlConnection conn, out int x, out int y) { int temp1 = 0; int temp2 = 0; string str_drw_id = "select * from dbo.data_record_whole where drw_id in (select max(drw_id) from dbo.data_record_whole)"; if (conn != null) { SqlCommand comm = new SqlCommand(str_drw_id, conn); SqlDataReader myreader; myreader = comm.ExecuteReader(); while (myreader.Read()) { temp1 = Convert.ToInt32(myreader["drw_id"]); temp2 = Convert.ToInt32(myreader["ts_id"]); } if (!myreader.IsClosed) { myreader.Close(); } } x = temp1; y = temp2; } 然后我加断点调试,就一直在 int temp1 = 0;和myreader = comm.ExecuteReader();来回跳,直到最后报出这样的异常: “System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理 其他信息: ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为打开。 2.ThreadPool.QueueUserWorkItem(h => 读取第1个数据库并且处理()); 意思是在异步定时器里也可以这样来调用方法吗? 因为我对多线程这方面还没什么认识,所以如果要解决顿卡的问题,我当前是否最要紧的就是补一下多线程这方面的知识?[/quote] 1、你这个读数据库的频率太快了。下一次定时器开始时上一次还没执行完。到后面就堆到一起了。 2、对你现在来说简单有效的办法是加长时间 3、你设计的又问题,没有读一串数据,只有最后50ms的数据是不同的。这太浪费了,每次读最后50MS的,然后让客户端判断。 4、数据量会随着时间越来越大,所以也越来越慢
正怒月神 2017-05-09
  • 打赏
  • 举报
回复
如果你的客户端不是很多的情况下。 其实使用 SqlDependency 来使数据库主动通知你的程序比较好。 而不是使用轮训50ms这种方式。毕竟数据库的打开关闭还是很消耗资源的。 说的简单点,其实你使用一种长连接的方式,去读取数据比较实在。而不是50ms都打开关闭数据库。
  • 打赏
  • 举报
回复
50 ms 进行一次数据库查询自然是很卡。有的人以为程序中只会有这样一、两个轮询,那是因为它很少评估别人的程序。 我们稍不留神,就会被一些实习生在系统里偷偷地扔进去什么“50ms 定时器”代码。实际上一看到程序突然某天变卡了,就会赶紧去检查有没有人偷偷植入什么定时器代码。所以这时候这种 timer 代码就不仅仅是你自己“玩儿”一个小例子的问题,而是整个的程序设计的事件驱动设计知识问题,代表着某些人对于涉及到事件驱动的部分可能完全不理解、完全不去进行设计。
  • 打赏
  • 举报
回复
这个问题中,你的描述方式其实挺好,你首先给出了不读取数据库的时候“图片移动很流畅”的前提,这就说明了你这个问题首先应该去解决占用主线程来进行非 UI 操作的问题,而并不需要考虑什么双缓冲之类的。 反之,这里其实也间接说明了,不把相关的事件驱动响应流程、异步计算处理等基本设计模式学会,终究是纠结到底层去了,而应用层的设计你还是不会。
秋的红果实 2017-05-09
  • 打赏
  • 举报
回复
还有个建议,你的问题可以考虑用flash做,写少许actionscript语句就行,省事多了 flash尽管不支持数据库,但支持文件,可以满足你们的项目需求
秋的红果实 2017-05-09
  • 打赏
  • 举报
回复
你可以建立连个连接conn1和conn2==>你可以建立两个连接conn1和conn2
秋的红果实 2017-05-09
  • 打赏
  • 举报
回复
火车移动,简单方法,就用你的方式,设置双缓存 timer1放到主线程,另两个放到两个独立的线程里面 至于你说的 ”将timer3换成异步定时器,但是读数据库的时候总是出错,一会说和DataReader已关闭需要打开,一会说Datareader已打开需要关闭“ 你可以建立连个连接conn1和conn2,分别应对timer1和timer2的动作。这样就不会出现你说的情况 实时性要求如此高的应用,为什么要使用数据库?放到内存处理不是更快吗,你的数据应该是从物理传感器传进来的吧,直接放到内存处理,datatable
qq_36198178 2017-05-09
  • 打赏
  • 举报
回复
引用 12 楼 From_TaiWan 的回复:
还有个建议,你的问题可以考虑用flash做,写少许actionscript语句就行,省事多了 flash尽管不支持数据库,但支持文件,可以满足你们的项目需求
多谢兄弟建议,但一个是需要连数据库,二是我现在就像煞笔一样,一片蒙,弄了两个月了,这么简单的问题都弄不好,更别说flash、actionscript我听都没听过的东西。感觉很烦躁,像解决问题,但力又没处使
qq_36198178 2017-05-09
  • 打赏
  • 举报
回复
引用 14 楼 sp1234 的回复:
50 ms 进行一次数据库查询自然是很卡。有的人以为程序中只会有这样一、两个轮询,那是因为它很少评估别人的程序。 我们稍不留神,就会被一些实习生在系统里偷偷地扔进去什么“50ms 定时器”代码。实际上一看到程序突然某天变卡了,就会赶紧去检查有没有人偷偷植入什么定时器代码。所以这时候这种 timer 代码就不仅仅是你自己“玩儿”一个小例子的问题,而是整个的程序设计的事件驱动设计知识问题,代表着某些人对于涉及到事件驱动的部分可能完全不理解、完全不去进行设计。
今天又浪费了一天时间 ,感觉自己完全是在瞎折腾,现在的状态是一片混乱,越弄越不知道如何下手。 今天看了一些多线程、委托的介绍,但完全是囫囵吞枣,根本没能解决问题。 索性我想把自己的思路清一下,直接回归问题本身,能麻烦你再看下吗: 我现在有两个 Forms.Timer: timer1控制图片的移动,timer2控制从数据库读数据并显示在界面中。 单独只有timer1的时候,图片移动很流畅。单两个timer一起就图片移动就一顿一顿的。 这种情况下我应该从什么地方下手去解决问题?
qq_36198178 2017-05-09
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
我同意你的这个观点,你并没有找到问题的原因 之前我跟踪过你的这个项目,并留有动画不凡的代码。但在其中加上另外的定时器后,对动画没有任何影响,至少肉眼是看不出来的 其实 Forms.Timer.Tick 的响应程序是在子线程中运行的,因此他不会,也不应该影响另一个 Forms.Timer.Tick 的行为
是的 那我换个描述 你能看下么: 我现在有两个 Forms.Timer: timer1控制图片的移动,timer2控制从数据库读数据并显示在界面中。 单独只有timer1的时候,图片移动很流畅。单两个timer一起就图片移动就一顿一顿的。 这种情况下我应该从什么地方下手去解决问题? (两个timer2的间隔时间我都调过,不能解决顿卡的问题)
xuzuning 2017-05-08
  • 打赏
  • 举报
回复
我同意你的这个观点,你并没有找到问题的原因 之前我跟踪过你的这个项目,并留有动画不凡的代码。但在其中加上另外的定时器后,对动画没有任何影响,至少肉眼是看不出来的 其实 Forms.Timer.Tick 的响应程序是在子线程中运行的,因此他不会,也不应该影响另一个 Forms.Timer.Tick 的行为
qq_36198178 2017-05-08
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
time3 的周期是 50ms,那么你其中的数据库访问处理能保证在 50ms 内完成吗?
我换过时间,换成100ms,200ms,依旧不行。 应该还是我问题描述的可能不是太清楚,感觉自己就是这样:只能说出自己不会,但具体是怎么个不会法,却说不清楚,这个贴我都是想了一下午,才写出来的。。。。
qq_36198178 2017-05-08
  • 打赏
  • 举报
回复
引用 1 楼 u010941149 的回复:
来店代码,我研究研究啊
兄弟 多谢哈 虽然是个很low的东西 但是老师不允许的话 我不好直接在网上全部贴出来,虽然我也很想让你帮忙研究下 望理解!
qq_36198178 2017-05-08
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
如果确实是定时执行什么操作,那么以定时器 Timer 驱动是正常的、正规的。 但是有的人不懂事件驱动的道理,用多个 timer 来模拟事件驱动,这就往往是搞砸了系统的顺畅性能。系统中不管是属性值改变,还是数据发送或者接收(I/O),或者是用户交互操作了一下子,等等,都是事件驱动的。这个设计技术和概念,远比你这整个项目还重要。 至于说你的 timer2、timer3 应该合并的流程,其实就是类似
var x = 查询最新id();
if(x != 旧的id)
{
    旧的id = x;
    ThreadPool.QueueUserWorkItem(h => 读取第1个数据库并且处理());
    ThreadPool.QueueUserWorkItem(h => 读取第2个数据库并且处理());
    ThreadPool.QueueUserWorkItem(h => 读取第3个数据库并且处理());
}
这样地异步、多线程地触发子任务,使得子任务能够并发执行。而不要见了什么并发任务又去想到 Timer。 你在事件驱动设计方面滥用 timer。在并发子任务方面滥用 timer。这两的问题都比较严重。
兄弟 首先很感谢您的回复。 虽然自己多线程、异步、数据库主动通知程序这些没听懂,主要是脑子里没货,但是觉得很受用,而且以后肯定用得着,目前我能一下子收获到的是: 1.确实 timer2 和 timer3可以合并成一个就行,这一点是我没想到,被你提醒,有一种恍然大悟的感觉。 但我试了下,将timer2和timer3合并到一个异步定时器里面,读数据库一直报错,我设置断点调试,一直在第一个数据库查询方法里乱跳,让我很搞不懂逻辑,不知道接下来怎么办。 我将异步timer里的代码,复制到timer2里(相当于我没有用异步定时器,而是用了两个timer控件:timer1控制图片移动,timer2控制读取数据库),则可以顺利读出数据,只是顿卡现象解决不了。 一样的程序,在异步定时器里却一直报异常。 我的第一个数据库查询方法是这样的:(主程序的异步定时器里,调用了一下这个方法,还没执行完,就异常了) public static void Query_data_whole(SqlConnection conn, out int x, out int y) { int temp1 = 0; int temp2 = 0; string str_drw_id = "select * from dbo.data_record_whole where drw_id in (select max(drw_id) from dbo.data_record_whole)"; if (conn != null) { SqlCommand comm = new SqlCommand(str_drw_id, conn); SqlDataReader myreader; myreader = comm.ExecuteReader(); while (myreader.Read()) { temp1 = Convert.ToInt32(myreader["drw_id"]); temp2 = Convert.ToInt32(myreader["ts_id"]); } if (!myreader.IsClosed) { myreader.Close(); } } x = temp1; y = temp2; } 然后我加断点调试,就一直在 int temp1 = 0;和myreader = comm.ExecuteReader();来回跳,直到最后报出这样的异常: “System.InvalidOperationException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理 其他信息: ExecuteReader 要求已打开且可用的 Connection。连接的当前状态为打开。 2.ThreadPool.QueueUserWorkItem(h => 读取第1个数据库并且处理()); 意思是在异步定时器里也可以这样来调用方法吗? 因为我对多线程这方面还没什么认识,所以如果要解决顿卡的问题,我当前是否最要紧的就是补一下多线程这方面的知识?
xuzuning 2017-05-08
  • 打赏
  • 举报
回复
time3 的周期是 50ms,那么你其中的数据库访问处理能保证在 50ms 内完成吗?
sdfgrtyu 2017-05-08
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
如果确实是定时执行什么操作,那么以定时器 Timer 驱动是正常的、正规的。 但是有的人不懂事件驱动的道理,用多个 timer 来模拟事件驱动,这就往往是搞砸了系统的顺畅性能。系统中不管是属性值改变,还是数据发送或者接收(I/O),或者是用户交互操作了一下子,等等,都是事件驱动的。这个设计技术和概念,远比你这整个项目还重要。 至于说你的 timer2、timer3 应该合并的流程,其实就是类似
var x = 查询最新id();
if(x != 旧的id)
{
    旧的id = x;
    ThreadPool.QueueUserWorkItem(h => 读取第1个数据库并且处理());
    ThreadPool.QueueUserWorkItem(h => 读取第2个数据库并且处理());
    ThreadPool.QueueUserWorkItem(h => 读取第3个数据库并且处理());
}
这样地异步、多线程地触发子任务,使得子任务能够并发执行。而不要见了什么并发任务又去想到 Timer。 你在事件驱动设计方面滥用 timer。在并发子任务方面滥用 timer。这两的问题都比较严重。
加载更多回复(3)
c#编程集合资料,不错的应用设计,另附一些开发案例的下载地址,欢迎大家下载学习。 学习完本课程之后,我们需要达到以下目标: (1) 掌握基本的C#语法,熟练运用C#编写基本的程序逻辑。 (2) 能够创建C#控制台应用程序并处理输入输出。 (3) 掌握C#中的数组,并对数组进行相应的排序,查找操作。 (4) 熟练使用C#的字符串对象。 (5) 掌握Windows窗体应用程序的创建,能熟练使用常用的控件设计窗体界面。 (6) 掌握MDI应用程序的开发步骤。 (7) 了解ADO.NET的组成和工作原理。 (8) 通过ADO.NET访问对C#项目开发全程实录视频教程(全10个案例):htt: /cnrdn com/gCxC 课程说明… 第1章C#语法基础…… 核心技能部分 1.1 Net与C#概述. 111Net与C#的产生与应用 1.1.2 Visual studio 10 1.1.3创建C井应用程序 12 2C#语言基础 16 121变量与常量…16 12.2运算符和表达式 19 123C#语言中的注释 1.2.4使用 Console处理输入输出 21 1.3 C#语句结构 25 131条件语句 .25 132循环结构 32 任务实训部分.… 38 1:根据时间输出问候信息…… 38 2:三个数字比较大小 39 3:判断用户输入的字母 .40 输出裴波那契数列…… 翻着音 40 巩固练习 第2章嵌套循环和数组. 44 核心技能部分… .45 2.1 VS2008中的调试技巧 45 2.2 嵌套循环 47 2.3 数组. 50 231数组的定义 50 232数组的基木操作 50 233数组的排序 51 任务实训部分… 55 1打印等腰三角形 55 2:数组的操作 56 3:数组的排序。 错误!定义书签 4:数组的排序 错误!未定义书签 巩固练习 57 第3章方法与字符串 59 C#项目开发全程实录视频教程(全10个案例):htt: /cnrdn com/gCxC 核心技能部分 使用方法 311方法的定义 312方法的调用 63 313参数传递 String类 321C#语言中常用的字符串处理方法... 68 322格式字符串 32.3 String Builder类. 3.3 类型转换…14 331隐式转换 74 332显式转换.…… 74 333常用类型转换方法… 7 任务实训部分 77 1:方法的使用 2:从邮件地址提取用广名 80 3:网址类型分析 81 4:字符串转换 82 巩固练习. 84 第4章指导学习:阶段总结 86 知识总结 翻着 .:::a:a:.:::a:B:a:::::..aa:::.:.aa:.:aa::: 86 41.1核心技能目标 86 412知识体系总结… 86 4.2 综合实训 任务1:制作月份日历 任务2:数组数据添加和排序. 错误!未定义书签 任务3:自杀游戏… 错误未定义书签。 第5章 Win form常用控件 核心技能部分 90 创建 Windows应用稈序 90 511 Windows应用程序概述. 90 512创建第一个 Windows应用程序 5.13项目结构分析 5,2 Windows窗体….97 5.,21窗体中的常用属性. 98 522窗体中的常用事件…… 99 Windows窗体中的常用控件 9 C#项目开发全程实录视频教程(全10个案例):htt: /cnrdn com/gCxC 5.31 Winform控件公共属性… 532标签Labe) 01 533文本框( TextBox) ·,, 101 534按钮( Button)…102 535列表框 ListBox) 102 536组合框 Combobox) 103 53.7单选按钮( Radio Button)和复选框( CheckBox) 104 538图片框( Pictruebo×)..105 54用 Message Box类显示消息窗口 541消息框的显示……106 5.4.2消息框的返回值 107 综合案例:职员信息管理. 109 仟务实训部分…… 115 1:ATM信息查询 115 2:编写建表向导窗体…… 3:火车票预定程厅… 124 巩固练习… 第6章 MD窗体应用程序设计… 核心技能部分…… 130 6.1 SD窗体和MD窗体应用程序简介. 错误!未定义书签。 6.2 单文档应用程序的创建 30 62.1菜单栏( Menustrip) 130 622菜单栏的创建 130 623上下文菜单 ContextMenuStrip) 6.3 多文档应用程序 错误!未定义书签。 631创建多文档界面应用程序. 错误!未定义书签 632排列子窗口 错误未定义书签。 64图像列表( mageList控件… 134 65工具栏( ToolStrip控件) 135 66 状态( StatusStrip) 138 67选项卡( TabControl Timer控件 69 MD综合示例 错误!定义书签 任务实训部分……143 1创建记事本”应用程序 错误!未定义书签 2:增强”记事本”功能∴ 143 3:实现记事本字体样式设置… 144 C#项目开发全程实录视频教程(全10个案例):htt: /cnrdn com/gCxC 4:变色窗体 巩固练习……… 1448 第7章 使用 ADO. NET完成简单的数据库操作…. ·,, 150 核心技能部分 151 ADO. NET概述 151 1 ADO.NET的简介 151 7.12 ADO.NET的优点 152 713 ADO.NET的结 52 NET Framework数据提供程序 1154 7.21 Connection对象…………………………155 72.2使用 Connection对象链接到数据库 7.3异常操作 57 731try和 catch块 158 732数据库链接示例 Command对象 ∴161 741 Command对象简介 161 742 Command综合示例 任务实训部分 1:实现进销存系统用户注册 168 2:实现进销存系统用户登录.… 171 3:实现用户的删除功能…… .:.::::::.:...:::.:.:a.::::.:::::::::.:::.:::::::.:::.: 172 巩固练习 174 第8章使用 Data Reader完成查询功能 177 核心技能部分… 178 8.1 DataReader对象 811 Data reader对象简介 178 812 Data Reader对象常用的属性和方法 813 Data reader对象的使用 179 8.2 控件 81 821 Listview控件介绍…… 81 822 Listview控件的使用 数据库操作综合示例 187 任务实训部分…… L94 1:使用 Listview控件查询部门员工信息… 94 2:部门员工信息删除和修改 3:实现员工信息模糊查询... 203 巩固练习 204 C#项目开发全程实录视频教程(全10个案例):htt: /cnrdn com/gCxC 第9章 使用 Dataset实现断开式数据访问 206 核心技能部分.… 207 91数据集( Dataset) ·,, 207 911数据集( DataSet)简介…207 912数据集的结构 08 91.3数据集的工作原理 914创建 Data set对象…… 211 9,2 DataAdapter对象1211 92.1 DataAdapter对象简介… 211 922 DataAdapter对象的使用.. 213 3 Datagridview控什的使用 219 931 Data gridview控件简介 219 932 Datagridview控件的使用. 221 9 综合示例 226 仟务实训部分.… 229 1:航班查询窗体设计 29 2:显示所有航班信息 232 3:根据两地査询航班 .233 4:航班详细信息查询 234 巩固练习 235 第10章课程总复习… …)误!未定义书签。 101知识总结 错误!未定义书签 1011核心技能目标 错误!定义书签。 101.2知识体系总结 错误!未定义书签。 02任务实训 错误!未定义书签。 第11章项目案例:酒店管理系统…… 错误!未定义书签 111训练技能点…… 错误未定义书签。 112需求说明 错误!未定义书签 113设计与思路分析 错误未定义书签 113.1系统功能分析 错误!未定义书签。 1132数据库设计 错误!定义书签。 114实现步骤…… 错误!未定义书签 115时间分配 错误!定义书签 C#项目开发全程实录视频教程(全10个案例):htt: /cnrdn com/gCxC 第1章C#语法基础 学习内容 c#的发展史 C#的基本语法 C#的流程控制语句 俨能力目标 掌握仗用S2008开发C#NET控制台应用程序 掌握C#语言的基本语法 掌握c#的程序流程控制语句 C#项目开发全程实录视频教程(全10个案例):htt: /cnrdn com/gCxC 本章简介 从本门课开始我们将要开始学习¢#语言和NET平台。本章将使学员对NET和¢#有一个 初步的认识,了解C#的开发环境,编写第一个C#控制台应用程序。C#语言的基本语法和我 们之前的学习的C语言、Java语言一样同属于C语言语法系列,有很多相似的地方,同时也 有一些不同的地方,因此我们在学习的时候需要注意它们之间的区别,不要混淆。在本章中, 我们需要掌握c#中的变量、数据类型、运算符、条件、分攴、循环等基C排基础语法,这些 语言层血的知识是我们编写所有程序的基础,因此必须牢固掌握。 核心技能部分 1.1Net与C#概述 1.1.1Net与C#的产生与应用 1. Anders Hejlsberg-C#之父 Anders hejlsberg原木是曾经大名鼎鼎的 Borland公司的一员,他曾经编写了 Pasca编译 器,又把 Turbo pascal变为面向对象的 Object Pascal,并以此为基础开发了轰动全球、盛极 时的廾发工具 Delphi,为 Boland公司赚了个盆钵满盈。 随着 Delphi日渐成熟, Anders的兴趣转向了Java领域,他在」ava开发领域扩展方面有 很多自己独特的想法,并想在此领域大展宏图,但 Borland的经营者们还要靠他这棵“摇 钱树”继续在 Delphi上人肆捞金,所以他有一段郁郁不得志。 比尔盖茨三顾茅庐,力邀 Anders hejlsberg,并许以重金和宽松的环境,终于把 Anders 挖到了微软的旗下,其后由其主持设计,在2000年6月发布了新的开发语言C#(读做C Sharp),此后微软在2002年推出了 Microsoft net开发平台。 3 1.1.1 Anders He jlsberg C#项目开发全程实录视频教程(全10个案例):http://cnrdn.com/gcxc 2.C#语及其特点 与Java一样,C#语言是一个完全的面向对象语言,它继承了C++、Java和 Delphi的优 点,又借鉴了VB的简单易学。体现了当今最新的程序设计技术的功能和精华。C#继承了C 语言的语法风柊,同时又继承了C+的面冋对象特性。不同的是,c#的对象模犁己经面向 Internet进行了重新设计,使用的是NET框架的类库;C#不再提供对指针类型的支持,使得 程序不能随便访问内存地址空间,从而更加健壮;C#不再支持多重继承,避免了以往类层次 结构中由于多重继承带来的可怕后果。NET框架为C#提供了一个强大的、易用的、逻辑结 构一致的程序设计环境。同时,公共语言运行时( Common Language runtime)为C#程序语 言提供了一个托管的运行时环境,使程序比以往更加稳定、安全。其特点有: 语言简洁。 保留了C++的强大功能 快速应用廾发功能 语言的自由性 强大的Web服务器控件。 支持跨平台 与XML相融合 如果之前没有其他话言的编程经验,使用c#语言编程将是一个良好的开端。如果有其 他语言的编程基础,程序员将发现¢#语言除了像ⅤB一样简单易学外,还是一种拥有强大 功能的语言。而且 ASP NET平台也是完仝通过c#语言开发的,这决定了C语言得天独厚的 优势。但在任何情况下,C#语言都不可能孤立地使用,它必须同 Microsoft. net framework 起使用,因为使用C#语言编写的所有代码总是在 Microsoft .net framework中运行。 1.1.2 Visual studio 微软针对Net推岀了功能强大的集成丌发环境来支持开发人员的№et应用程序丌发,这 就是 Visual studio,它是目前最主要的Net平台开发环境。VS集成了 NET Framework和Net 开发插件,可以用来进行几乎所有Net应用程序的设计和开发L作,如 Windows应用程序 Web应用稈序、 Windows服务、智能设备应用程序等。 随着 NET Framework的不断升级, Visua| Studio也在不断升级,其发展历程可以用表1-1-1 来说明 表1-1-1Vs发展历程 年代 2002 2003 2005 2008 2010 廾发工具版木Vs2002 VS2003 VS2005 VS2008 VS2010 Net 1.0 1.1 2.0 3.5 4.0 Framework 由于本学期的知识点主要集中在C#的基本语法、 Win forms开发和 ADO. NET,这些知识
4 浏览器网络编程(共两周) 4.1 浏览器工作原理(老师讲解1学时,学生理解1学时) 浏览器工作原理如图4-1所示。 图4-1 浏览器工作原理 (1) 浏览器分析超链指向页面的 URL。 (2) 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址。 (3) 域名系统 DNS 解析出清华大学服务器的 IP 地址。 (4) 浏览器与服务器建立 TCP 连接 (5) 浏览器发出取文件命令: GET /chn/yxsz/index.htm。 (6) 服务器 给出响应,把文件 index.htm 发给浏览器。 (7) TCP 连接释放。 (8) 浏览器显示“清华大学院系设置”文件 index.htm 中的所有文本 4.2 浏览器功能结构(老师讲解1学时,学生理解1学时) 浏览器程序功能结构如图4-2所示。 图4-2 浏览器功能结构 1) 浏览器有一组客户、一组解释程序,以及管理这些客户和解释程序的控制程序。 2) 控制程序是其中的核心部件,它解释鼠标的点击和键盘的输入,并调用有关的组件来执行用户指定的操作。 3) 例如,当用户用鼠标点击一个超链的起点时,控制程序调用一个客户从所需文档所在的远地服务器上取回该文档,并调用解释程序向用户显示该文档 4) HTML 解释程序是必不可少的,而其他的解释程序则是可选的。 5) 解释程序把 HTML 规格转换为适合用户显示硬件的命令来处理版面的细节。 6) 许多浏览器还包含 FTP 客户,用来获取文件传送服务。 7) 一些浏览器也包含电子邮件客户,使浏览器能够发送和接收电子邮件 8) 浏览器将它取回的每一个页面副本都放入本地磁盘的缓存中。 9) 当用户用鼠标点击某个选项时,浏览器首先检查磁盘的缓存。若缓存中保存了该项,浏览器就直接从缓存中得到该项副本而不必从网络获取,这样就明显地改善浏览器的运行特性。 10) 但缓存要占用磁盘大量的空间,而浏览器性能的改善只有在用户再次查看缓存中的页面时才有帮助。 11) 许多浏览器允许用户调整缓存策略。 4.3 浏览器设计(老师讲解2学时,学生设计2学时) (1)浏览器功能设计 浏览器功能设计主要确定设计好的浏览器需要具备哪些功能,以及这些功能是以什么方式进行实现,这个步骤相当于软件设计中的“需求分析”,其中必须保证基本功能的具备,即浏览器必须能够浏览Web页面。 (2)浏览器界面设计 浏览器界面设计主要确定浏览器的页面布局,设定浏览器窗口上设置哪些功能菜单项、设置哪些功能按钮、设置哪些状态栏,它们各自的位置如何、属性如何、对应的变量如何等等。 (3)浏览器代码设计 浏览器代码设计主要是确定对上述的设计的功能在代码上怎样实现,包括选用的程序语言和编程平台选择、程序代码的编写、程序代码的调试、程序功能的测试等等。 4.4 浏览器编程设计平台(老师讲解2学时,学生理解4学时) (1)VS2005编程平台 (2)WebBrowser类及其使用 (3)一些浏览器程序的代码分析 4.5 浏览器开发步骤(8天) (1)熟悉VS2005平台,建立项目(半天) 打开VS2005选择“创建项目”,进入“新建项目”对话框,如图4-1所示。 图4-1 “新建项目”对话框 在“新建项目”对话框的项目类型窗口中选中“Visual C#”作为项目开发语言,在模板窗口中选中“Windows 应用程序”作为项目开发模板,在“名称”、“位置”编辑框中输入自己设定的项目名字和项目存储位置,本讲义使用“CSharp浏览器”作为项目名称,如图4-2所示。 图4-2 输入新建项目的属性 完成输入内容后,单击“确定”按钮,进入项目VC#开发窗口“Form.cs[设计]”,如图4-3所示。 图4-3 VC#开发窗口“Form.cs[设计]” (2)界面设计(1天) ○1设计菜单栏如图4-4所示。(半天) 图4-4 设计菜单栏 设计“文件”菜单如4-5所示。 图4-5 设计“文件”菜单 设计“编辑”菜单如图4-6所示。 图4-6 设计“编辑”菜单 设计“查看”菜单如图4-7所示。 图4-7 设计“查看”菜单 设计“收藏”菜单如图4-8所示。 图4-8 设计“收藏”菜单 设计“工具”菜单如图4-9所示。 图4-9 设计“工具”菜单 ○2设计工具栏、用户区和状态栏如图4-10所示(半天) 图4-10 工具栏和状态栏 (3)功能代码编辑 ○1初始化代码(半天) 双击“Form”设计页面进入代码编写页面,如图4-11所示。 图4-11 代码编写页面 初始化页面代码如下: ////////////////////////////////////////////////////////

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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