从Txt加载到C#中的列表框

时间:2016-04-25 01:17:34

标签: c# forms visual-studio filestream

我已经将保存部分放下了,我知道它有效,但是当我点击加载按钮时,它不会显示我从转到speak.txt文件的文本框中保存的任何内容

using System;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Grades : Form
{

    private StreamWriter fil;
    public Grades()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            fil = new StreamWriter("saying.txt"); //This is the txt file
        }
        catch (DirectoryNotFoundException exc)
        {
            lstBxDisplay.Text = "Nothing " +
                exc.Message;
        }
        catch (System.IO.IOException exc)
        {
            lstBxDisplay.Text = exc.Message;
        }
    }      

    // saving the files to the saying.txt 
    private void btnSaveAs_Click(object sender, EventArgs e)
    {
        try
        {
            fil.WriteLine(txtBxLastName.Text);
            txtBxLastName.Text = "";
            txtBxLastName.Focus();
        }
        catch (System.IO.IOException exc)
        {
            lstBxDisplay.Text = exc.Message;
        }
    }

    // next is the load button to load the files into the list/display box
    private void btnLoad_Click(object sender, EventArgs e)
    {


        string inValue;

        try
        {
            using (StreamReader infil =
                new StreamReader("saying.txt"))
            {
                inValue = infil.ReadLine();
                while (inValue != null)
                {
                    inValue = infil.ReadLine();
                    if (inValue != null)
                        this.lstBxDisplay.Items.Add(inValue);
                } // end of while
            } // end of using
        }
        catch (System.IO.IOException exc)
        {
            lstBxDisplay.Text = exc.Message;
        }
    }

    private void Grades_FormClosing(object sender, FormClosingEventArgs e)
    {
        try
        {
            fil.Close();
        }
        catch
        {

        }
    }


}
}

没有加载到列表框中的任何原因?我已经尝试了标签和文本框来显示消息,但它们都不起作用。我调试了程序并且执行正常

1 个答案:

答案 0 :(得分:0)

这里有多个问题,但我会指出两个可以让您的代码正常工作的主要问题。

  1. 尝试保存时,您没有关闭流。如果流保持打开状态,则在尝试“加载”文件时将永远无法读取值。您需要在fil.Close();方法结束时致电btnSaveAs_Click
  2. 这是保存应该如何阅读。

        fil.WriteLine(txtBxLastName.Text);
        txtBxLastName.Text = "";
        txtBxLastName.Focus();
    
        fil.Close();
    
    1. 您正在“加载”方法中跳过文件的第一行。您在循环中调用infil.ReadLine();,然后在将其添加到列表框之前再次调用它。您需要移动第二个ReadLine()。如果您只是在文件中写入一行,则现有代码将跳过第一行并尝试再次读取该行,该行将为空(无第二行)。因此,它永远不会在您的列表框中添加任何内容。
    2. 这是读取的顺序。

          using (StreamReader infil = new StreamReader("saying.txt"))
          {
              inValue = infil.ReadLine();
      
              while (inValue != null)
              {
                  this.lstBxDisplay.Items.Add(inValue);
      
                  inValue = infil.ReadLine();
      
              } // end of while
          } // end of using
      

      这些改变会让你工作。现在要指出的是,你正在阅读和写入一个错误的文件。您不应该在表单加载中打开流并等待按钮单击以从该流写入/读取。 除非你有充分的理由去做你正在做的事情,否则你应该打开你的流,执行读/写操作,并立即关闭你的流。对于一个简单的文件IO,我甚至建议使用不同的机制。查看MSDN for the System.IO.File Class以获取更简单的方法来读取行或将行写入文件。