我目前有一个像这样的文本框:
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);
}
如果有人可以提供指示或帮助我,我将非常感激!谢谢
答案 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。