2016-04-19 180 views
0

我想从csv文件加载个人数据,如果他们在ukNumber文本框中输入“2”,它将从ID 2开始的文件中带入数据,因为它只会加载csv文件中的最后一行。无法读取csv文件中的值

public void search_Click(object sender, EventArgs e) 
    { 
     string answer = ukNumber.Text; 

     string idStr; 
     string firstnameStr; 
     string surnameStr; 
     string jobroleStr; 
     string salaryStr; 

     using (var reader = new StreamReader(File.OpenRead("C:\\Users\\hughesa3\\Desktop\\details.csv"), 
           Encoding.GetEncoding("iso-8859-1"))) 
     { 
      while (!reader.EndOfStream || answer == idStr) 
      { 
       var line = reader.ReadLine(); 
       var values = line.Split(','); 

       idStr = values[0]; 
       firstnameStr = values[0]; 
       surnameStr = values[0]; 
       jobroleStr = values[0]; 
       salaryStr = values[0]; 

       richTextBox1.Text = "Name: " + values[1] + "\nSurname: " + values[2] + "\nJob Role: " + values[3] + "\nSalary: £" + values[4]; 
      } 
     } 
    } 
+5

你应该追加到richTextBox1.Text。此时你覆盖了那里的内容 – Dbuggy

回答

1

改变这一行:

richTextBox1.Text = "Name: " + values[1] + "\nSurname: " + values[2] + 
        "\nJob Role: " + values[3] + "\nSalary: £" + values[4]; 

richTextBox1.Text += "Name: " + values[1] + "\nSurname: " + values[2] + 
        "\nJob Role: " + values[3] + "\nSalary: £" + values[4]; 

或者,构建整个文本首先使用一个StringBuilder并一次性分配给richTextBox1.Text

1

如果您在本文件的中间:

!reader.EndOfStreamtrue所以你必须:

while (true || answer == idStr) => while (true) 

它会去,当然在文件的结尾。

我想你想下面的检查:

while (!reader.EndOfStream && answer != idStr) 
1

为什么不使用:

string idYouSearched = "2"; 
    var encoding = Encoding.GetEncoding("iso-8859-1"); 
    var csvLines = File.ReadAllLines(fileName,encoding); 

    foreach (var line in csvLines) 
    { 
     var values = line.Split(','); 
     if(values[0].Contains(idYouSearched)) 
      { 
       richTextBox1.Text += "Name: " + values[1] + 
           "\nSurname: " + values[2] + 
          "\nJob Role: " + values[3] + 
           "\nSalary: £" + values[4]; 
      } 
     } 

    It`s much simpler and you not holding open stream when working with the UI. 
+1

'File.ReadLines'是一个更好的样式(你不想' ''richTextBox1.Text + ='可以导致常量*重新绘制*和*闪烁*;收集'StringBuilder'中的所有数据,然后(一次!)将收集的数据分配给'richTextBox1' –

1

据我了解,你需要从指定ID的行只值。当您达到正确的ID时,您需要打破循环。

  while (!reader.EndOfStream) 
      { 
       var line = reader.ReadLine(); 
       var values = line.Split(','); 

       idStr = values[0]; 
       if (answer == idStr) { 

        richTextBox1.Text = "Name: " + values[1] + "\nSurname: " + values[2] + "\nJob Role: " + values[3] + "\nSalary: £" + values[4]; 

        break; 
       } 
      } 

旁注:

1)读(或写)CVS文件不是简单的任务本身,因为它可能会出现。最好使用如下的库:CsvHelperA Fast CSV Reader

2)你的代码错过了错误处理:你可能会得到空的“行”,并非所有的值都可能被设置为这样(例如,值[4],例如,会抛出超出范围的异常,等等