C#类中操作UI层控件状态[原]
场景:
1:假设有窗体F,里面有一按钮BtnA,及一Label控件.
2:有一类A,里面有一方法Start().
要求:
点击按钮BtnA后,根据Start()方法里面操作逻辑,将状态显示在Label中.
最开始做的时候是实例化类A的时候将整个窗体或者要改变值的控件传入类A中,然后再在类A中操作,可想而知这样是非常不好的.
查阅资料后,终于找到了一点解决方法:利用委托或事件,以下是基本代码.
1 private void BtnA_Click(object sender, EventArgs e)
2 {
3 A ms = new A();
4 //委托方法{实例化类A中定义的委托}
5 //ms.tt= new A.dSetSourceInfo(this.SetInfoOne);
6 //或
7 //事件触发{注册类A中定义的事件}
8 ms.SetInfo += new EventHandler(ms_SetInfoTwo);
9 Thread m = new Thread(new ThreadStart(ms.Start));
10 m.Start();
11 }
12
13
14//委托
15
16 private delegate void mySetInfo(string s);
17 void SetInfoOne(string s)
18 {
19 if (this.InvokeRequired)
20 {
21 this.Invoke(new mySetInfo(SetInfoOne), s);
22 return;
23 }
24 this.Label1.Text = s;
25 }
26
27
28//事件
29
30 void ms_SetInfoTwo(object sender, EventArgs e)
31 {
32 if (this.InvokeRequired)
33 {
34 this.Invoke(new System.EventHandler(ms_SetInfoTwo), sender);
35 return;
36 }
37 this.Label1.Text = (string)sender;
38 }
1 public class A
2 {
3 //定义事件
4 public event EventHandler SetInfo;
5 //类A中执行的事件
6 private void SetSourceInfo(object sender, EventArgs e)
7 {
8 if (SetInfo!= null) { SetInfo(sender, e); }
9 }
10 //或
11 //定义委托
12 public dSetSourceInfo tt;
13 public delegate void dSetSourceInfo(string str);
14 //类A中执行的方法
15 private void SetSourceInfott(string str)
16 {
17 if (tt != null) { tt(str); }
18 }
19 public A() { }
20
21 /**//// <summary>
22 /// 开始
23 /// </summary>
24 public void Start()
25 {
26 //委托使用
27 //SetSourceInfott("哈哈哈");
28 //Thread.Sleep(1000);
29 //SetSourceInfott("哈哈哈1");
30 //Thread.Sleep(1000);
31 //SetSourceInfott("哈哈哈2");
32
33 //事件使用
34 SetSourceInfo("哈哈哈",null);
35 Thread.Sleep(1000);
36 SetSourceInfo("哈哈哈1",null);
37 Thread.Sleep(1000);
38 SetSourceInfo("哈哈哈2",null);
39 }
40 }
以上为一些简单的应用,其它复杂的基本上都可以按照这一招来做.
转载于:https://www.cnblogs.com/Mars_Chen/archive/2009/10/10/1580299.html
C#类中操作UI层控件状态[原]相关推荐
- springboot 项目中在普通类中调用dao层的mapper 出现空指针异常
springboot 项目中在普通类中调用dao层的mapper 出现空指针异常 参考文章: (1)springboot 项目中在普通类中调用dao层的mapper 出现空指针异常 (2)https: ...
- android 异步回调中操作UI线程,UI同步、卡死阻塞等性能问题
android开发中,回调无处不在,整个android开发的框架就是以回调机制建立起来的.如:activity,service,broadcast,fragment,view事件监听,baseadap ...
- SpringBoot在自定义类中调用service层等Spring其他层
解决方案: 1.上代码@Component public class ServerHandler extends IoHandlerAdapter {@Autowiredprotected Healt ...
- QT开发之调用其它类中的UI控件的方法
比如类A和类B, 在B中有一个QTreeWidget控件,需要在A中调用操作 先在A中声明一个 QTreeWidget *tree; 然后在B中声明一个类A的指针 A *a; a->tree = ...
- android 不能在子线程中更新ui的讨论和分析
问题描述 做过android开发基本都遇见过 ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改 ui,子线程要修改 ...
- android操作ui线程
runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, "网络 ...
- Android开发:操作UI线程4种方法
我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据.但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的.下面总结4 ...
- redis工具类_SpringBoot 操作 Redis 数据
SpringBoot 操作 Redis 数据 简介 Redis 是一个开源的NoSQL数据库,基于内存的键值存储,速度快.Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集. 5种 ...
- 在.NET中操作XmlDocument,XmlReader的方法
用XmlDocument进行读取 大家想必一定都了解XML,利用XML技术来存储数据和文档是一件很容易的事情,.NET Framework 在它的命名空间System.Xml 就提供了一种可以很方便的 ...
最新文章
- 问题解决-Failed to resolve: com.android.support.constraint:constraint-layout:1.0.0-alpha7
- python官方书籍-有哪些Python入门的书籍值得推荐?
- [数据结构] 散列表(哈希表)
- windows sybase bit显示勾_micro:bit怎么玩?只需5个简单步骤,光速上手
- 【C++】38.类成员变量声明为 对象与指针的区别
- ospf 环回口的路由条目_OSPF的LSA类型
- jsfl 改变舞台宽高
- flume1.8 开发指南学习感悟
- 怎么实现注解_通透!一口气搞懂注解到底怎么用
- DIV+CSS布局 - 弹性盒子布局
- 【Kilav】数据库知识点速通 其二
- java 发送封包_【Java学习笔记】自动封包和解包(Autoboxing和AutoUnboxing)
- elasticsearch 配置 之 discovery.zen.ping.unicast.hosts
- 封装获取非行内样式函数
- spring-cloud-context源码解读
- 进销存仓库管理系统:规范数据、流程与管理
- C++课本的练习题及答案(第五章)
- 人工智能大作业——五子棋
- 成为zabbix合作伙伴费用及意义
- erp系统选型需满足哪些条件?一位erp选型专家分享经验