在猪八戒网上逛了逛,发现某个买家想制作一个书店销售统计的工具,于是花了两个小时做了它,遇到不懂的地方时果断百度之,百度果然是好东西,什么都能搜出来。在做这个小东西期间我学到了很多。

 

先看下买家给的需求:

 

 

说明:1,姓名可后台修改。可锁定窗口(重要),可最小化(可有可无,有了最好)

      2 ,输入值里每一次输入数值,总计框中自动累加,输入值框里支持正负数,一位小   数

      3 8个分列(A-H),8个总计框,8个输入值框,平衡对应

      4,工具附带时间显示,另外结果可另存TXT文本,支持window XP系统

      TXT形式为ABC序号,姓名,总分

      5,可有帮助,也可没,但有版权信息。编辑里有“清除,另存TXT”等选项。文件里有关闭选线。

      6,软件名称(清溪镇新世纪书店销售统计工具)

      7,工具界面最好好看些,美观些。

要求其实不多,所以这个东西很快就做好了。接下来说说它的具体做法吧。

此处我是使用vs2005来做这个工具的,完成后的主界面如下:

 

为了编程操作的方便操作类似的控件都采用了控件数组,代码如下:

inputbox[i] = new Label();
                inputbox[i].Location = new Point(21, 63 + 41 * i);
                inputbox[i].Text = "周杰伦";
                this.Controls.Add(inputbox[i]);   //把内存中的控件数组添加到窗体上

 

每个左排的textbox都有一个doubleclick事件,功能是双击相应textbox其右边的textbox完成统计功能,代码如下:

private void textBox1_DoubleClick(object sender, EventArgs e)
        {
            double input_1 = Double.Parse(textBox1.Text.ToString());
            double oldsum = Double.Parse(textBox9.Text.ToString());
            double newsum = 0.0;
            newsum = oldsum + input_1;
            textBox9.Text = newsum.ToString();
            this.Focus();
        }

添加一个timer控件目的是实现当前时间的显示,代码如下:

private void timer1_Tick(object sender, EventArgs e)
        {
            DateTime d = DateTime.Now;
            time.Text = d.ToLongTimeString();
        }

添加一个菜单项,实现更改姓名、窗口置顶、另存为文本文件、清零等功能。

更改姓名是从d盘根目录读取一个txt文件,然后读取行替换label控件数组的text属性,代码如下:

private void 更改姓名ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream("d:\\name.txt", FileMode.Open);
            StreamReader sr = new StreamReader(fs, Encoding.Default);
            int i = 0;
            while (i < 8)
            {
                string s = sr.ReadLine();
                inputbox[i].Text = s;
                i++;
            }
            fs.Close();
        }

窗口置顶的功能主要是修改窗体的TopMost属性,若为true那么窗体置顶,反之窗体不置顶,代码如下:

private void 窗口置顶ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.TopMost = true;
        }

private void 取消置顶ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.TopMost = false;
        }

清零功能非常容易实现,代码如下:

private void 清除ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            textBox1.Text = "0";
            textBox2.Text = "0";
            textBox3.Text = "0";
            textBox4.Text = "0";
            textBox5.Text = "0";
            textBox6.Text = "0";
            textBox7.Text = "0";
            textBox8.Text = "0";
            textBox9.Text = "0";
            textBox10.Text = "0";
            textBox11.Text = "0";
            textBox12.Text = "0";
            textBox13.Text = "0";
            textBox14.Text = "0";
            textBox15.Text = "0";
            textBox16.Text = "0";
        }

另存为文件功能主要实现把数据记录到txt文件中,此处添加了一个SaveFileDialog控件,为了让用户选择存储路径已经存储的文件名,代码如下:

private void 另存为ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string s;
                s=saveFileDialog1.FileName;
                FileStream fs=new FileStream(s,FileMode.Create);
                StreamWriter sw=new StreamWriter(fs,Encoding.Default);

                string temp1 = inputbox[0].Text.ToString() + "  总计:" + textBox9.Text.ToString() + "元" ;
                string temp2 = inputbox[1].Text.ToString() + "  总计:" + textBox10.Text.ToString() + "元";
                string temp3 = inputbox[2].Text.ToString() + "  总计:" + textBox11.Text.ToString() + "元";
                string temp4 = inputbox[3].Text.ToString() + "  总计:" + textBox12.Text.ToString() + "元";
                string temp5 = inputbox[4].Text.ToString() + "  总计:" + textBox13.Text.ToString() + "元";
                string temp6 = inputbox[5].Text.ToString() + "  总计:" + textBox14.Text.ToString() + "元";
                string temp7 = inputbox[6].Text.ToString() + "  总计:" + textBox15.Text.ToString() + "元";
                string temp8 = inputbox[7].Text.ToString() + "  总计:" + textBox16.Text.ToString() + "元";
                sw.WriteLine(temp1);
                sw.WriteLine(temp2);
                sw.WriteLine(temp3);
                sw.WriteLine(temp4);
                sw.WriteLine(temp5);
                sw.WriteLine(temp6);
                sw.WriteLine(temp7);
                sw.WriteLine(temp8);
                fs.Flush();
                sw.Close();
                fs.Close();
            }
          
        }

 

好了,程序的大部分功能已经OK了。接下来说说这次的体会。

1、对文件的操作完毕后一定要记得关闭操作,读的话关闭文件,写的话除了关闭文件外还要先关闭写入流。

2、创建控件数组后一定要执行this.Controls.Add(控件)命令,否则控件数组中的控件只存在于内存中,不会显示到窗体上。

3、写代码必须对字符串数据的转换非常了解,这样在实践中才能左右逢源。

4、 StreamReader sr = new StreamReader(fs, Encoding.Default); 其中Encoding.Default选项是为了支持中文的读取,在某些电脑上也可以是Encoding.UTF-8等。