WinFrom多窗体间如何实现for循环切换,在线等啊,急?

yuanxing19870710 2011-07-02 05:05:25
现有5个窗体 :main,A,B,C,D,在main窗体中有四个checkbox,分别对应A B C D四个Form对象,点击main页面中的按钮,触发事件,按先后选中顺序,无限循环show出选中的窗体,直到点击取消按钮,如顺序 D,B,A,C ,先后选中这四个checkbox后,点击main中确定按钮, 先显示D,然后 B,A,C,要求之间有时间间隔,如5000毫秒,任何窗体不能死锁,点击mian页面取消按钮,A B C D 四个窗体close掉。
目前小弟完成了一部分,但是貌似在a b c d四个窗体切换时,main死锁了,不能进行任何操作。

部分代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace SwitchWindowApp
{
public partial class Control : Form
{
public delegate void SwitchDelegate(Form form);
SwitchDelegate switchDelegate = null;
public Control()
{
InitializeComponent();
switchDelegate = new SwitchDelegate(DelegateMethod);
}

List<Form> list = new List<Form>();

private void runbtn_Click(object sender, EventArgs e)
{
if (list.Count == 0)
{
MessageBox.Show("您还没选中任何窗体", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
Thread thread = new Thread(new ParameterizedThreadStart(ThreadMethod));
thread.Start(list);
}
}

public void ThreadMethod(Object formlist) {
List<Form> list = (List<Form>)formlist;
while (1 == 1)
{
foreach (Form item in list)
{
switchDelegate(item);
}
}
}

public void DelegateMethod(Form form) {
if (InvokeRequired)
{
Invoke(new SwitchDelegate(DelegateMethod),form);
}
else {
form.Show();
form.Location = new Point(500,500);
Thread.Sleep(5000);
form.Hide();
}
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
list.Add(new Form1());
}
else
{
list.Remove(new Form1());
}
}

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox2.Checked)
{
list.Add(new Form2());
}
else
{
list.Remove(new Form2());
}
}

private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
if (checkBox3.Checked)
{
list.Add(new Form3());
}
else
{
list.Remove(new Form3());
}
}

private void checkBox4_CheckedChanged(object sender, EventArgs e)
{
if (checkBox4.Checked)
{
list.Add(new Form4());
}
else
{
list.Remove(new Form4());
}
}

private void checkBox5_CheckedChanged(object sender, EventArgs e)
{
if (checkBox5.Checked)
{
list.Add(new Form5());
}
else
{
list.Remove(new Form5());
}
}
}
}
...全文
133 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanxing19870710 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jq_whh 的回复:]
这个问题使用timer似乎更好一些
[/Quote]

我在list集合里添加的时候是new出来的,所以不存在你说的那个问题,但是还是谢谢你热心的解答。
lnmhfeng 2011-07-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhy2003119 的回复:]

你的问题出现在
C# code

private void checkBox5_CheckedChanged(object sender, EventArgs e)
{
if (checkBox5.Checked)
{
list.Add(new Form5());
}
else
{
list.Remove(new Form5());
}
}……
[/Quote]

正解
老鼠爱上猫 2011-07-03
  • 打赏
  • 举报
回复
你的问题出现在

private void checkBox5_CheckedChanged(object sender, EventArgs e)
{
if (checkBox5.Checked)
{
list.Add(new Form5());
}
else
{
list.Remove(new Form5());
}
}



new Form5 ADD 和Remove 是两个不同的对象

你应该定义一个私有的变量

private Form1 fm1;
private Form2 fm1;
private Form3 fm1;
private Form4 fm1;
private Form5 fm1;


//在构造函数里 实例化

fm1 = new Form1();
fm2 = new Form2();
fm5 = new Form5();


if (checkBox1.Checked)
{
list.Add(fm5);
}
else
{
list.Remove(fm5);
}

jq_whh 2011-07-03
  • 打赏
  • 举报
回复
这个问题使用timer似乎更好一些
余山水 2011-07-02
  • 打赏
  • 举报
回复
if (checkBox1.Checked)
{
list.Add(new Form1());
}
else
{
list.Remove(new Form1());
}
这样不对吧,应该移除加入的
例如 dd = new new Form1();
if (checkBox1.Checked && dd 不再列表中)
{
list.Add(dd) }
else && dd在列表,删除
{
list.Remove(dd);
}

110,538

社区成员

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

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

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