zoukankan      html  css  js  c++  java
  • C# WinForm动态控件实例:口算训练

    昨天晚上回寝室看到室友正在被一个C#课的作业苦恼,作业的内容是编写一个口算训练程序,能够实现随意添加题目数量。于是,喜欢写C#的我就决定解救一下他们。

    创建动态控件

    既然要动态添加,那就必须使用动态控件了。在C#中,控件也是类,除了在画窗体的时候添加固定的控件外,还可以在代码中用实例化类的方法添加。

    具体操作是,我们先定义一个控件变量,然后对控件设置Size, Location这些属性,最后,再把控件添加的一个panel中。而且我们只要定义一次控件变量,之后用new不停的添加,就可以获得很多控件了。

    部分代码如下

    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属性的控件。

    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中。

    运行结果如下:

     其他的不废话了,贴代码!

    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 国际许可协议进行许可。

  • 相关阅读:
    黑客长期摇号不中"黑"掉北京小客车摇号网
    网络犯罪新动向:“黑客”学历不高 年龄不超30岁
    McAfee重返科技业 研制D-Central防政府监视
    windows系统服务编程代码示例分享
    Fireeye火眼公司发布报告,评论中国网络间谍活动
    FBI是如何破获“美国少女”裸照勒索案的
    得到内网域管理员的5种常见方法
    别人在用你的什么技术在赚钱.其实你天天在做
    慢一点恋爱,别急着洞房
    元芳,关于向朋友借钱你怎么看
  • 原文地址:https://www.cnblogs.com/ImYZF/p/3345452.html
Copyright © 2011-2022 走看看