N Khan
N Khan

Reputation: 366

Populate Gridview at runtime using textfile

it may seem to be simple problem to many of you, but want i am trying to do is i am reading a text file on a click event using StreamReader (ASP.net & C#) after reading that text file i am splitting each line with ',' delimiter and then each part of it i am storing in Datatable's column and then binding the datatable to my gridview, my problem is i have written the code but i m getting empty gridview like this

enter image description here
Gridviews Column header i have created from designer with autogeneratecolumns="false"

my code is

protected void readfile_Click(object sender, EventArgs e)
{
    string line;
    DataTable dt = new DataTable();
    using (StreamReader sr = new StreamReader(@"D:\Temp\fileread\readtext.txt"))
    {
        while ((line = sr.ReadLine()) != null)
        {
            string[] parts = line.Split(',');
            dt.Rows.Add();
            for (int i = 0; i < parts.Length; i++)
            {
                dt.Columns.Add();
                dt.Rows[0][i] = parts[i];
                MyGridView.DataSource = dt;
                MyGridView.DataBind();
            }
        }
        sr.Close();
    }

my text file has data

1,1,4,2,"#",Description1
5,5,4,2,"#",Description2
3,3,6,3,"#",Description3
2,2,4,2,"#",Description4
4,5,4,2,"#",Description5

Hope you got it what i am trying to ask.

Upvotes: 3

Views: 12102

Answers (3)

VMAtm
VMAtm

Reputation: 28355

  1. You should move your code with adding the DataColumn outside the for-loop
  2. You should create new DataRow using DataTable.NewRow method
  3. You should call data binding methods only once, and after the loops.

Your code should be something like this:

DataTable dt = new DataTable();
dt.Columns.Add("Row No", typeof(Int32));
dt.Columns.Add("Col No", typeof(Int32));
dt.Columns.Add("Width", typeof(Int32));
dt.Columns.Add("Height", typeof(Int32));
dt.Columns.Add("ImageUrl", typeof(String));
dt.Columns.Add("Description", typeof(String));

using (StreamReader sr = new StreamReader(@"D:\Temp\fileread\readtext.txt"))
{
    while ((line = sr.ReadLine()) != null)
    {
        string[] parts = line.Split(',');
        var row = dt.NewRow();
        for (int i = 0; i < parts.Length; i++)
        {
            row[i] = parts[i];
        }
        // important thing!
        dt.Rows.Add(row);
    }
    sr.Close();
}
MyGridView.DataSource = dt;
MyGridView.DataBind();

Upvotes: 1

Denys Wessels
Denys Wessels

Reputation: 17049

How about something like this:

    protected void readfile_Click(object sender, EventArgs e)
    {
        DataTable table = new DataTable();
        table.Columns.Add("Row No.");
        table.Columns.Add("Col No.");
        table.Columns.Add("Width");
        table.Columns.Add("Height");
        table.Columns.Add("Image URL");
        table.Columns.Add("Description");

        using (StreamReader sr = new StreamReader(@"D:\Temp\fileread\readtext.txt"))
        {
            while (!sr.EndOfStream)
            {
                string[] parts = sr.ReadLine().Split(',');
                table.Rows.Add(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5]);
            }
        }
        MyGridView.DataSource = table;
        MyGridView.DataBind();
    }

Upvotes: 2

rs.
rs.

Reputation: 27467

Add columns to datatable using code below

DataTable dt = new DataTable();
dt.Columns.Add("Row No", typeof(Int32));
dt.Columns.Add("Col No", typeof(Int32));
dt.Columns.Add("Width", typeof(Int32));
dt.Columns.Add("Height", typeof(Int32));
dt.Columns.Add("ImageUrl", typeof(String));
dt.Columns.Add("Description", typeof(String));

And bind datatable (dt) after you populate all rows in datatable, after while loop

using (StreamReader sr = new StreamReader(@"D:\Temp\fileread\readtext.txt"))
{
    while ((line = sr.ReadLine()) != null)
    {
        string[] parts = line.Split(',');
        var dr = dt.NewRow(); //use newrow to create new row
        for (int i = 0; i < parts.Length; i++)
        {
            dr[i] = parts[i];
        }
        
        dt.Rows.Add(dr); //add row to datatable now
    }
    sr.Close();
}
//bind datatable to Gridview after we load file into dt
MyGridView.DataSource = dt;
MyGridView.DataBind();

Upvotes: 1

Related Questions