WINFORM控件状态控制解决方案

thestarmm 2011-06-08 01:34:40
需求大致描述如下:
WINFORM程序,有一个窗体有多个button,多个textbox等一些列控件,
窗体状态的变更,或者控件操作,或者异步操作,致使某些控件的Enable或Readonly属性变更。
需求是实现是能简便的控制各类控件的enable,readonly属性。

现在的写法比较原始:也就是每个操作都会去更改指定控件的enable,readonly属性。

难点:
1. 由于有异步的存在,某些控件状态是在异步结束时更改,如果多处异步,就不太容易控制,
2. 易于维护,如出现enable状态不对,修改简单,但又不会影响其他状态或操作。

我想这种问题在各类winform项目中常会遇到,希望能给出合理解决方案,谢谢:)

建议:回帖前可以先看一下其他人的回帖。
谢绝纯顶和路过

...全文
144 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
PISANAN 2011-06-09
  • 打赏
  • 举报
回复
也可以用一个字典(键值对),将条件集合保存的控件的Tag属性下。
PISANAN 2011-06-09
  • 打赏
  • 举报
回复
两个字典
第一个字典,key 控件Name,Value控件是否可用的条件字典。
条件字典,key 条件名,Value 该条件是否可用。

设置控件是否可用的方法,参数:控件name;条件名;是否可用

设置控件Name 下的 条件字典中的 条件名 状态为:是否可用

通过窗体Find查找控件

如果该控件下的条件全为 True 该控件可用。否则不可用。
thestarmm 2011-06-09
  • 打赏
  • 举报
回复
被读16次,没人回答,看来需要时不时的顶一下了,谢绝纯顶和路过这句话不该写:(
thestarmm 2011-06-09
  • 打赏
  • 举报
回复
@bdmh,@PISANAN,@isjoe
谢谢各位:)
isjoe 2011-06-09
  • 打赏
  • 举报
回复

采用异步委托和同步计数器协同的你的操作。只是个思路


// 使用异步委托代替线程
public delegate void MyDelegate();

// 假设开三个异步线程。。。
// 构造一个计数器类对象,并将总数线程设置为3
MyCount mc = new MyCount(3);//你可以再次封装,将总数计数器自动化
MyDelegate md1 = new MyDelegate(this.MyDelegateMethon);
md1.BeginInvoke(new AsyncCallback(this.MyDelegateCompleted), mc);

MyDelegate md2 = new MyDelegate(this.MyDelegateMethon);
md2.BeginInvoke(new AsyncCallback(this.MyDelegateCompleted), mc);

MyDelegate md3 = new MyDelegate(this.MyDelegateMethon);
md3.BeginInvoke(new AsyncCallback(this.MyDelegateCompleted), mc);






// 你的实现方法
private void MyDelegateMethon()
{
// 你的操作。。。。。。
int n = 0;
}

// 异步委托完成事件
private void MyDelegateCompleted(IAsyncResult ar)
{
MyCount mc = (MyCount)ar.AsyncState;

AsyncResult result = (AsyncResult)ar;
MyDelegate md = (MyDelegate)result.AsyncDelegate;
md.EndInvoke(ar);
// 判断所有线程是否完成
if (mc.IsCompleted())
{
// 你的设置代码。。。
int n = 0;
}
}



public class MyCount
{
// 计数器
private long m_lCount = 0L;

// 总数
private long m_lTotal = 0L;

/// <summary>
///
/// </summary>
/// <param name="lTotal"></param>
public MyCount(long lTotal)
{
this.m_lTotal = lTotal;
}

// 是否全部线程已经完成
public bool IsCompleted()
{
Interlocked.Increment(ref this.m_lCount);
if (Interlocked.Read(ref this.m_lCount) == this.m_lTotal)
{
Interlocked.Exchange(ref this.m_lCount, 0L);
return true;
}
return false;
}

}
thestarmm 2011-06-08
  • 打赏
  • 举报
回复
被3人阅读?标题不够吸引?
thestarmm 2011-06-08
  • 打赏
  • 举报
回复
@bdmh
谢谢回复,
属性操作都是在线程结束之后做的,线程进行中的属性操作这里不做要求:)这里提到的是异步问题是:
举个简单例子:
有异步操作A,B,
A,B在执行中都需要确保控件X enable=false;
A,B都结束后需要确保控件X enable=true;
所以A或者B某一个先结束都不能立即设置X的enable=true;而需要等到A和B都结束才可以。
这个就是我提到的难点,而实际情况比这个例子复杂的多。


bdmh 2011-06-08
  • 打赏
  • 举报
回复
对控件的操作,一定要注意同步,不能多个线程同时对其某一个属性进行操作,把控制状态的代码写到一个方法里,方法可以接收参数,比如一个数组,里面存放的是你要设置的组件的实例,名字都行,随你,然后根据这个数组来设置对应的组件

110,536

社区成员

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

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

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