C# WinForm动态控件实例:口算训练
昨天晚上回寝室看到室友正在被一个C#课的作业苦恼,作业的内容是编写一个口算训练程序,能够实现随意添加题目数量。于是,喜欢写C#的我就决定解救一下他们。
创建动态控件
既然要动态添加,那就必须使用动态控件了。在C#中,控件也是类,除了在画窗体的时候添加固定的控件外,还可以在代码中用实例化类的方法添加。
具体操作是,我们先定义一个控件变量,然后对控件设置Size, Location这些属性,最后,再把控件添加的一个panel中。而且我们只要定义一次控件变量,之后用new不停的添加,就可以获得很多控件了。
部分代码如下
1 2 3 4 5 | txtBox = new TextBox(); txtBox.Size = new Size(50, 50); //设置大小 txtBox.Location = new Point(x, y); //设置位置坐标 txtBox.Name = "txt" + Convert.ToString(i); //设置控件名(可重名) panelQuestion.Controls.Add(txtBox); |
访问动态控件
在窗体中手动绘制的控件,我们可以通过控件名直接访问,但是动态添加的控件就不可以了,只能在panel中查找对应Name属性的控件。
1 | string str = ((TextBox)panelQuestion.Controls.Find( "txtBox" , true )[0]).Text; |
Find方法中的第一个参数为控件名称,第二个参数为是否搜索所以子控件。由于可以重名,所以返回的是一个控件数组,上面的[0]表示取第一个返回结果。由于返回的类型是Control,还需要强制转换为具体的控件类型,所以前面加了(TextBox),强制转换为TextBox类型,这样才能当做TextBox使用。
具体实现
窗体设计如上图,控件名称分别为txtTotal, btnAdd, btnJudge, panelQuestion
在出题按钮事件中,进行进行动态添加TextBox和Label,每行3个TextBox,显示两个加数和一个空白框填写结果,Name都为txt+行号;还有三个label,从左到右为“+”、“=”和空白的用来显示对错。
在批改按钮事件中,访问已经动态建立的控件,获取TextBox里的值,然后进行批改,把对错写入每行最后一个Label中。
运行结果如下:
其他的不废话了,贴代码!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | 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; namespace AddProgram { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void btnAdd_Click( object sender, EventArgs e) { if (txtTotal.Text == "" ) { MessageBox.Show( "请输入题目数!" , "错误" ); return ; } //判断题目数是否未填 panelQuestion.AutoScroll = true ; //为panel添加滚动条 panelQuestion.Controls.Clear(); //清空已有题目 int total = int .Parse(txtTotal.Text); //题目总数 TextBox txtBox = new TextBox(); Label label = new Label(); Random rand = new Random(); //随机数 for ( int i = 0; i < total; i++) { for ( int j = 0; j < 3; j++) { txtBox = new TextBox(); txtBox.Size = new Size(50, 50); //textbox大小 txtBox.Location = new Point(10 + 70 * j, 30 * i); //textbox坐标 txtBox.Name = "txt" + Convert.ToString(i); //设定控件名称 if (j < 2) { txtBox.Text = Convert.ToString(rand.Next(100)); txtBox.ReadOnly = true ; } //产生随机数,作为加数 panelQuestion.Controls.Add(txtBox); //把控件加入到panel中 label = new Label(); label.Size = new Size(12, 12); label.Location = new Point(64 + 70 * j, 30 * i); switch (j) { case 0: label.Text = "+" ; break ; case 1: label.Text = "=" ; break ; case 2: label.Name = "labelResult" + Convert.ToString(i); break ; } panelQuestion.Controls.Add(label); } } } private void btnJudge_Click( object sender, EventArgs e) { if (txtTotal.Text == "" ) { MessageBox.Show( "请输入题目数!" , "错误" ); return ; } int total = Convert.ToInt32(txtTotal.Text); for ( int i = 0; i < total; i++) { TextBox[] txtBox = new TextBox[3]; //用控件数组来定义每一行的TextBox,总共3个TextBox for ( int j = 0; j < 3; j++) //获取原来已经动态添加的TextBox,这样才能访问 txtBox[j] = (TextBox)panelQuestion.Controls.Find( "txt" + Convert.ToString(i), true )[j]; Label label = (Label)panelQuestion.Controls.Find( "labelResult" + Convert.ToString(i), true )[0]; if (txtBox[2].Text == "" ) //如果未填答案,直接批改为错误 { label.Text = "×" ; continue ; } int add = Convert.ToInt32(txtBox[0].Text) + Convert.ToInt32(txtBox[1].Text); if (add == Convert.ToInt32(txtBox[2].Text)) label.Text = "√" ; else label.Text = "×" ; } } } } |
本作品由www.imyzf.com/?p=15创作,采用知识共享署名 4.0 国际许可协议进行许可。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步