C#实现控件数组
DotNet里取消了控件数组,这让习惯了使用VB控件的程序员非常不适应。有什么办法能够实现控件数组的功能吗?答案是肯定的。
众所周知,控件数组最主要的两个优点:可以循环附值;可以响应同一个事件。从而大大简化了代码。下面根据这两个方面,举一个例子。
新建一个工程,在窗体上添加5个textbox(textBox1...textBox5)和2个button (button1、button2)。
1.循环附值
总的来说,有两种实现方法:
1.1 定义动态的控件数组。因为DotNet里支持动态的控件数组,所以我们可以把已设计好的控件,附给动态的数组,这样就可以任意的使用了。代码如下:
private void button1_Click(object sender, System.EventArgs e)
{
TextBox[] myTextBox = new TextBox[5];
myTextBox[0] = textBox1;
myTextBox[1] = textBox2;
myTextBox[2] = textBox3;
myTextBox[3] = textBox4;
myTextBox[4] = textBox5;
for ( int i=0;i< 5;i++)
{
myTextBox[i].Text = "fill_1";
}
}
来源 https://www.cnblogs.com/tanding/archive/2012/07/16/2593289.html
4.13更新
费堵塞延时
public static void Delay(int milliSecond)
{
int start = Environment.TickCount;
while (Math.Abs(Environment.TickCount - start) < milliSecond)
{
Application.DoEvents();
}
}
https://www.csdn.net/gather_2c/MtTagg3sODctYmxvZwO0O0OO0O0O.html
Application.DoEvents();+sleep()
如果没有加上 DoEvents的话,由于循环时间会比较久就会出现假死的状态,而且程序不能处理其他的事件。而如果加上DoEvents的话就会对文本框的值实时响应,给用户带来较好的用户体验,可是DoEvents也带来了效率上的问题,处理同样的一个事件调用了DoEvents后效率降低了好几倍,这也是为什么要慎用的原因了。
线程和Application.DoEvents()
创建辅助线程
应用程序可以创建一个或多个线程以执行方法。创建辅助(或从属)线程的第一个步骤是创建 ThreadStart 代理,指定要由该线程执行的方法。然后将 ThreadStart 代理传递给 Thread 类的构造函数。例如,要启动新的线程并执行 MyFunction 方法,请调用 Thread 类的 Start 方法,如下所示:
ThreadStart starter = new ThreadStart(MyFunction);
Thread t = new Thread(starter);
t.Start();
从辅助线程更新用户界面
您可以使用 Control.Invoke 从 UI 线程以外的其他线程更新用户界面 (UI)。此方法在 UI 线程上的控件线程上下文中执行代理。.NET Framework 精简版只支持 .NET Framework 完整版中的重载 Control.Invoke 方法。Control.Invoke 只使用一个参数:一个指定在 UI 线程上执行哪个方法的代理。该代理的类型必须为 EventHandler,并且具有以下签名:
void MyFunctionName(object sender, EventArgs e)
需要注意的一点是,如果要在辅助线程中更新 UI,就必须在代码中调用 Application.DoEvents()。调用 Application.DoEvents() 可确保辅助线程激发的任何事件都由该 UI 线程处理。
下面的示例代码说明如何创建辅助线程,然后从 UI 线程和辅助线程更新名为 listBox1 的 ListBox 控件:
// 此变量将保留辅助线程设置的一些文本
public string Message = "";
// 创建辅助线程,然后将项目从 UI 线程添加到
// ListBox 中
public void DoThreading()
{
// 创建并启动辅助线程
ThreadStart starter = new ThreadStart(this.UpdateListBox);
Thread t = new Thread(starter);
t.Start();
// 循环 4 次,每次都向 ListBox 中添加一条消息
for(int i = 0; i < 4; i++);
{
this.listBox1.Items.Add("来自 UI 线程的消息");
this.listBox1.Update();
// 处理 UI 线程中排队的事件
Application.DoEvents();
// 将进程挂起一秒钟
Thread.Sleep(1000);
}
this.listBox1.Items.Add("来自 UI 线程的上一条消息");
this.listBox1.Update();
}
public void UpdateListBox()
{
for(int j = 0; j < 5; j++)
{
// 设置要从辅助线程添加到 ListBox 中的
// 消息
this.Message = "辅助线程的循环数 = " + j.ToString();
// 在 ListBox 的线程上下文中调用 WorkerUpdate
// 方法
this.listBox1.Invoke(new EventHandler(WorkerUpdate));
Thread.Sleep(700);
}
}
// 为更新 ListBox 从辅助线程中
// 调用的代理
public void WorkerUpdate(object sender, EventArgs e)
{
this.listBox1.Items.Add(this.Message);
this.listBox1.Update();
}
https://www.cnblogs.com/jxnclyk/archive/2010/08/06/1794473.html
https://blog.csdn.net/wjhl04/article/details/82620358
https://www.cnblogs.com/rainbow70626/p/4739161.html
2048 代码 4.7更新(未完成)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace _2048
{
public partial class Form1 : Form
{
public int[,] map = new int[4, 4];
RichTextBox[,] mapp = new RichTextBox[4, 4];
bool died()
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
if (map[i, j] == 0) return true;
}
return false;
}
void clearmap()
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
map[i, j] = 0;
}
void clearmapp()
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
mapp[i, j].Text = "";
mapp[i, j].BackColor = Color.White;
}
}
bool notfull()
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (map[i, j] == 0) return true;
return false;
}
void setnew(int b)
{
Random rd = new Random();
for (int a = 0; a < b;)
{
int i = rd.Next(0, 4);
int j = rd.Next(0, 4);
if (map[i, j] == 0) {
map[i, j] = 2; a++; }
if (!notfull()) break;
}
}
void rdsetnew()
{
Random rd = new Random();
int a = rd.Next(1, 3);
setnew(a);
drawmap();
}
void drawmap()
{
clearmapp();
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (map[i, j] != 0)
{
switch (map[i, j])
{
case 2:
{
mapp[i, j].BackColor = Color.LightYellow;
mapp[i, j].Text = Convert.ToString(map[i, j]);
break;
}
case 4:
{
mapp[i, j].BackColor = Color.Aqua;
mapp[i, j].Text = Convert.ToString(map[i, j]);
break;
}
case 8:
{
mapp[i, j].BackColor = Color.DeepPink;
mapp[i, j].Text = Convert.ToString(map[i, j]);
break;
}
case 16:
{
mapp[i, j].Text = Convert.ToString