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 шт):
При чтении строк используйте 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;
}
}
Вставленные в таблицу данные выглядят следующим образом:
