Windows Forms, dataGridView не отображает данные из DataTable

Следующий код принимает данные из файла data.txt по нажатию на кнопку. Заполняет DataTable table столбцами, зачем строками. Далее я добавляю в dataGridView1 столбцы из table, указывая при этом DataPropertyName, но программа не работает корректно. Прошу помощи. Файл хранит себе данные для построения графика: Файл обязательно должен содержать столбец с аргументом x. Столбцов, как и строк, может быть неограниченное количество. Для построения графика в качестве координат используется аргумент и выбранный пользователем столбец данных (y или z в данном случае).

x,y,z
0,0,1
1,5,5
2,3,2
private void OpenButton_Click(object sender, EventArgs e)
        {
            FileInfo file = new FileInfo("data.txt");
            string fileText = File.ReadAllText(file.FullName);
            string[] strs = fileText.Split(new char[] {'\n', '\r' }, StringSplitOptions.RemoveEmptyEntries);

            ds.Tables.Add();
            string[] columns = strs[0].Split(',');
            for (int i = 0; i < columns.Length; i++)
            {
                DataColumn a = new DataColumn(columns[i].ToString());
                ds.Tables[0].Columns.Add(a);
            }

            for (int i = 1; i < strs.Length; i++)
            {
                string[] date = strs[i].Split(',');
                DataRow rw = ds.Tables[0].NewRow();
                rw.ItemArray = date;
                ds.Tables[0].Rows.Add(rw);
            }
            dataGridView1.AutoGenerateColumns = false;

            for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
            {
                DataGridViewTextBoxColumn a = new DataGridViewTextBoxColumn();
                a.HeaderText = ds.Tables[0].Columns[j].ColumnName;
                a.DataPropertyName = ds.Tables[0].Columns[j].ColumnName;
                dataGridView1.Columns.Add(a);
            }

            dataGridView1.DataSource = ds.Tables[0];
        }

Ответы (1 шт):

Автор решения: Frehzy

При чтении строк используйте ReadAllLines. Данный метод возвращает string[], который вы сможете вставить в метод Create.

Решение, которое я предлагаю ниже - сделать привязку напрямую класса с данными к dgv, а не заполнять в лоб datatable (? зачем-то...) и потом уже её привязывать к данным

private void Form1_Load(object sender, EventArgs e)
{
    var line = new List<string>()
    {
        "x,y,z",
        "2,3,1",
        "5,1,3"
    }; //тестовые данные. У вас тоже самое, но в массиве храниться будет
    var bindingList = Create(line); //для конвертации из массива в лист используйте `.ToList()`
    dataGridView1.DataSource = bindingList; //сама привязка
}

Метод, который создаёт BindingSource

private BindingSource Create(IEnumerable<string> fileList)
{
    var columnsName = fileList.First().Split(','); //не используется, но вдруг будет нужно
    //Названия колонок берутся из класса XYZ из свойств

    var rows = new BindingList<XYZ>();
    foreach (var row in fileList.Skip(1))
    {
        var values = row.Split(',').Select(x => int.Parse(x)).ToArray();
        rows.Add(new XYZ(values[0], values[1], values[2]));
    }
    return new BindingSource(rows, default);
}

Класс XYZ

internal class XYZ
{
    public int X { get; private set; }

    public int Y { get; private set; }

    public int Z { get; private set; }

    public XYZ(int x, int y, int z)
    {
        X = x;
        Y = y;
        Z = z;
    }
}

Вставленные в таблицу данные выглядят следующим образом:

введите сюда описание изображения

→ Ссылка