如何使用Visual Basic将数据从txt文件传输到DataGridView上

时间:2018-10-11 17:25:41

标签: c# datagridview system.io.file

我目前有一个像这样的文本框:

John-15feb23-星期二-6:00pm运气不好

John2-18feb23-周三-3:00 pm-未知

John3-16feb23-Friday-5:00 pm-运气不好

它用'-'分隔,所以我知道它必须放在不同的列上。

我在将数据传递到DataGridVew时遇到麻烦。我试图将其传递到DataTable,然后传递到Datarows,然后从那里传递到我的dataGrid。

这是我到目前为止所拥有的:

 private void button2_Click(object sender, EventArgs e)
    {

        DataTable ss = new DataTable();

        ss.Columns.Add("Alumno");
        ss.Columns.Add("Profesor");
        ss.Columns.Add("Día");
        ss.Columns.Add("Hora");
        ss.Columns.Add("Asunto");

        DataRow row = ss.NewRow();

        String linea;
        try
        {
            StreamReader tem = new StreamReader("C:\\cardiel.txt");
            linea = tem.ReadLine();
            while (linea != null)
            {

                row["Alumno"] += linea.Split('-')+ "\n";
                row["Profesor"] += linea.Split('-') + "\n";
                row["Día"] += linea.Split('-') + "\n";
                row["Hora"] += linea.Split('-') + "\n";
                row["Asunto"] += linea.Split('-') + "\n";
                ss.Rows.Add(row);
                linea = tem.ReadLine();
                foreach (DataRow Drow in ss.Rows)
                {
                    int num = dataGridView1.Rows.Add();
                    dataGridView1.Rows[num].Cells[0].Value = Drow["Alumno"].ToString();
                    dataGridView1.Rows[num].Cells[1].Value = Drow["Profesor"].ToString();
                    dataGridView1.Rows[num].Cells[2].Value = Drow["Día"].ToString();
                    dataGridView1.Rows[num].Cells[3].Value = Drow["Hora"].ToString();
                    dataGridView1.Rows[num].Cells[4].Value = Drow["Asunto"].ToString();
                }
            }
            tem.Close();
        }
        catch (Exception x)
        {
            Console.WriteLine(x.Message);
        }

如果有人可以提供指示或帮助我,我将非常感激!谢谢

1 个答案:

答案 0 :(得分:0)

如果您尝试按照原始问题仅将文件中的数据获取到DataGridView中,则似乎您正在采取额外的步骤。这会将其发送到DataGridView:

//Buffer for IO reading
const Int32 BufferSize = 512;

private void button2_Click(object sender, EventArgs e)
{
    try
    {
        //Open the file and keep it open while there are lines with using
        using (var fileStream = File.OpenRead(fileName))
        {
            //Open the reader and keep it open while reading non null lines
            using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize))
            {
                String line;
                //While the StreamReader is reading a line and it is not null, how to handle the line
                while ((line = streamReader.ReadLine()) != null)
                {
                    //Split the string into an array
                    string[] splitarray = line.Split('-');

                    //Add the pieces of the array as a new row into the DataGridView
                    //This should be inside of a try/catch block or have some validation to make sure the array is a certain length (5 in this case)
                    dataGridView.Rows.Add(splitarray[0], splitarray[1], splitarray[2], splitarray[3], splitarray[4]);
                }
            }
        }
    }
    catch(Exception ex){
        Console.WriteLine(ex.message)
    }
}

每次StreamReader读取另一行(!)时,您都不需要DataRow,DataTable或遍历所有行。

注意:如果索引更改顺序,此操作将失败。如果没有足够的索引,且IndexOutOfRange异常,它将失败。另外,如果数据中还有破折号,可能会打乱您的订单。

IO注意:如果未在单独的线程上完成此操作,则UI将冻结,因为您正在使用主线程执行此操作。您可以使用BackgroundWorker执行IO,然后将结果与BindingSource配合使用,如下所述。

如果您在其他地方使用DataTable和DataRow,则可以将它们保留,但是并不需要填充DataGridView。

现在,如果此文件非常大且包含许多行,则绘制此文件将非常慢(根据经验,我知道)。如果您希望它有很多(甚至经常重画一些),我建议使用BindingSource