我朋友的朋友是个老师,昨天我朋友让我帮做一个《学生点名》程序给他,于是今天就抽个空把这个小应用给写了,现在分享下给大家。
首先我们需要明确这个程序需要具备什么功能,我给他设定的功能如下
1.可以维护学生信息(目前只能维护姓名,用于点名而已没必要做成HR系统一样)。
2.在学生信息中随机点名。
针对第一个需求,我们需要把学生信息保存下来,由于只是个小应用,我们可以做成单机版的不需要连数据库,你让一个教语文的老师电脑装个数据库也不现实把?
所以保存数据我采用的是保存到XML文件里面。
数据维护操作需要简洁所以我们做成如下图操作
注:添加多名学生请以英文输入法条件下“,”分隔,例:学生甲,学生乙
保存操作XML 代码如下
public static class XMLHelper
{
///
/// 写入XML
///
/// 学生姓名
public static void saveToXml(string username)
{
string path = Application.StartupPath + "\StudentName.xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(path);
XmlNode node;
node = xmlDoc.SelectSingleNode("/config/username");
if (node != null)
{
XmlElement n = xmlDoc.CreateElement("username");
n.InnerText = username;
xmlDoc.SelectSingleNode("config").AppendChild(n);
}
else
{
node.InnerText = username;
}
xmlDoc.Save(path);
}
public static List
{
//list
List
string path = Application.StartupPath + "\StudentName.xml";
//使用的时候,首先声明一个XmlDocument对象,然后调用Load方法,从指定的路径加载XML文件.
XmlDocument doc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释
using (XmlReader reader = XmlReader.Create(path, settings))
{
doc.Load(reader);
XmlNode xn = doc.SelectSingleNode("config");
// 得到根节点的所有子节点
XmlNodeList xnl = xn.ChildNodes;
foreach (XmlNode xn1 in xnl)
{
Student st1 = new Student();
// 将节点转换为元素,便于得到节点的属性值
XmlElement xe = (XmlElement)xn1;
// 得到st节点的所有子节点
XmlNodeList xnl0 = xe.ChildNodes;
if (xnl0.Count!=0)
{
st1.StudentName = xnl0.Item(0).InnerText;
stlist.Add(st1);
}
}
}
return stlist;
}
}
在学生信息中随机点名功能实现:
点击开始,名字跳到再次点击随机一个名字
代码实现如下:
private void button1_Click(object sender, EventArgs e)
{
try
{
if (button1.Text == "暂停")
{
flag = false;
button1.Text = "开始";
}
else
{
flag = true;
button1.Text = "暂停";
}
// int i = 0;
List
string[] strName = new string[person.Count];
foreach (var s in person)
{
string ss = s.StudentName;
}
for (int i = 0; i < person.Count; i++)
{
strName[i] = person[i].StudentName;
}
AsyncMethod(strName);
}
catch (Exception ex)
{
MessageBox.Show("点名出错:"+ex.ToString());
}
}
public string GetRandomNumber(string[] a)
{
Random rnd = new Random();
int index = rnd.Next(a.Length);
return a[index];
}
public async void AsyncMethod(string[] strName)
{
Console.WriteLine("start async");
var result = await MyMethod(strName);
Console.WriteLine("end async");
}
public async Task
{
while (flag)
{
label1.Text = GetRandomNumber(strName);
await Task.Delay(10); //模拟耗时操作
}
return 0;
}
这里用到了多线程操作,这样就可以实现数据循环和按钮可以重用。
到此,一个小应用就完成了,后续我们可以追加的功能如下
1.界面添加几个勾选框,做个随机规则制定
1.1 选择性别,比如我只想让男同学回答问题
1.2 点过名的是否再次点名,就是再次随机的时候是否排除已点过名的同学
如果大家有需要上述完整代码可以关注我然后私信发信息给我,看到后我会把完整代码发给大家