4

I have written the following code for reading data from .csv file:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace CSVRead
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void buttonRead_Click(object sender, EventArgs e)
        {
            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("Username");
            dataTable.Columns.Add("Password");
            dataTable.Columns.Add("MachineID");
            string filePath = textBox1.Text;
            StreamReader streamReader = new StreamReader(filePath);
            string[] totalData = new string[File.ReadAllLines(filePath).Length];
            totalData = streamReader.ReadLine().Split(',');
            while (!streamReader.EndOfStream)
            {
                totalData = streamReader.ReadLine().Split(',');
                dataTable.Rows.Add(totalData[0], totalData[1], totalData[2]);
            }
            dataGridView1.DataSource = dataTable;
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
    }
}

Here is my CSV File data (readCSV.csv):

Username, Password, MachineID
abc, abc, 123
jkl, jkl, 789
rst, rst, 456

I have a dataGridView in my Windows Form Application (see image link below as I haven't accumulated enough reputation to post an image) and want to display data from CSV file in this grid view. This code isn't throwing any error/warning but it is simply not executing the way it should. On clicking the Find button the data is not getting displayed in the dataGridView. I am using Visual Studio 2013 Professional.

WinFormApp

Silly Me: Oops!!! The above code is working absolutely fine... I was writing my code on Remote machine and I stored my file on local machine. Also, the name of button click event was mistyped.

NOTE: The answer has been marked as accepted because its logic works too. The code written above in my question is also a working absolutely fine

6
  • Are you checking autogeneratecolumns on DataGridView? msdn.microsoft.com/es-es/library/… Commented Nov 3, 2015 at 8:24
  • So far I haven't checked it Commented Nov 3, 2015 at 8:26
  • File.ReadAllLineswill read the file into an enumerable, so you can just do something like var contents = File.ReallAllLines(path) and get rid of the stream reader and then just loop over the contents and split the line there. Commented Nov 3, 2015 at 8:27
  • Did you debug and found any problem? You might need a dataGridView1.DataBind() at the end. Commented Nov 3, 2015 at 8:27
  • CSV files are more complicated than that, for instance, what if the comma is in quotes? Commented Nov 3, 2015 at 8:28

2 Answers 2

6

Here is working example to solve your problem.but before you start you should know few things while reading CVS files or excel files. For excel file always first row is the name of columns so you do not need to add columns to Data-table manually

 try
            {
                // your code here 
     string CSVFilePathName = @"path and file name";
                string[] Lines = File.ReadAllLines(CSVFilePathName);
                string[] Fields;
                Fields = Lines[0].Split(new char[] { ',' });
                int Cols = Fields.GetLength(0);
                DataTable dt = new DataTable();
                //1st row must be column names; force lower case to ensure matching later on.
                for (int i = 0; i < Cols; i++)
                    dt.Columns.Add(Fields[i].ToLower(), typeof(string));
                DataRow Row;
                for (int i = 1; i < Lines.GetLength(0); i++)
                {
                    Fields = Lines[i].Split(new char[] { ',' });
                    Row = dt.NewRow();
                    for (int f = 0; f < Cols; f++)
                        Row[f] = Fields[f];
                    dt.Rows.Add(Row);
                }
                dataGridClients.DataSource = dt;  
 }
            catch (Exception ex )
            {
                MessageBox.Show("Error is " + ex.ToString());
                throw;
            }
Sign up to request clarification or add additional context in comments.

7 Comments

This is not having any effect on the dataGridView (not getting any error msg or warning though)
have you change datagrid name to follow your DG name. i have tested this code and the result is fine.regarding display error add try catch your code and exception
My datagrid name is same as displayed in the properties window. Can you help me with Try catch code?
here is example how to use try catch try { // your code here } catch (Exception ex ) { MessageBox.Show("Error is " + ex.ToString()); throw; } /// please check the code , already updated with try catch
I am marking your answer as accepted because your logic works too!!! My code in the question is correct either
|
0

First check the autogenerateColumns on dataGridView. Next check if your datatable is correcting being filled.

Check this example, can help you a lot: Faster way of reading csv to grid

2 Comments

Do I need to set autogenerateColumns to false? I am new to C# and VS so I need some helpful easy-to-understand pointers
There wasn't any error in the logic or code... I have updated how silly i was. Thanks for your efforts

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.