DataGridView добавить строку показывает скремблированную строку внизу - PullRequest
0 голосов
/ 21 мая 2018

Я создаю простой инструмент для редактирования файлов значений, разделенных точкой с запятой, и использую сетку данных для отображения и редактирования данных.Когда я показываю данные в сетке данных, текст в последней строке отображается плохо, что странно, потому что последняя строка должна быть пустой.Это происходит, когда у меня AllowUserToAddRows на true.Когда для этого свойства задано значение false, последняя строка отображается правильно, но я хочу иметь возможность добавлять строки в представление данных.Я попытался сделать это с помощью обходного пути, добавив пустую строку, нажав кнопку, и затем выполнил следующую строку кода: DataTable.Rows.Add();, где DataTable имеет тип DataGridView, но затем снова возникает та же проблема рендеринга.И в обоих случаях, когда я щелкаю по неверно отображенной строке и щелкаю по другой строке, я получаю ArgumentOutOfRangeException на rowIndex.Является ли это ошибкой в ​​DataGridView, и если да, то есть ли обходной путь, когда я могу загрузить текстовый файл с разделенными точками с запятой в DataGridView и иметь возможность добавлять в него строки?Или я должен изменить некоторые свойства?

1 Ответ

0 голосов
/ 21 мая 2018

Сначала вам нужно правильно преобразовать файл в DataTable.Затем установите DataSource из DataGridView для таблицы данных, которую вы загружаете с помощью файла.Установите AllowUserToAddRows в true и затем сохраните DataTable обратно в файл.

Пример

Допустим, вот содержимое файла:

Column1;Column2
a1;b1
a2;b2
a3;b3

И мы ожидаем показать их в DataGridView, как показано ниже:

| Column1     | Column2    |
|=============|============|
|a1           |b1          |
|-------------|------------|
|a2           |b2          |
|-------------|------------|
|a3           |b3          |
|-------------|------------|
|             |            |
|-------------|------------|

Вы можете просто загрузить и сохранить данные, используя следующий код:

DataTable dt;
string fileName = @"d:\file1.txt";
private void Form1_Load(object sender, EventArgs e)
{
    dt = LoadFile(fileName);
    this.dataGridView1.DataSource = dt;
}
private void SaveButton_Click(object sender, EventArgs e)
{
    SaveFile(dt, fileName);
}

LoadFile

DataTable LoadFile(string fileName)
{
    var dt = new DataTable();
    var lines = System.IO.File.ReadAllLines(fileName);
    if (lines.Count() == 0)
        return dt;
    lines.First().Split(';').ToList().ForEach(x =>
    {
        dt.Columns.Add(new DataColumn(x));
    });
    lines.Skip(1).ToList().ForEach(x =>
    {
        dt.Rows.Add(x.Split(';'));
    });
    return dt;
}

SaveFile

public void SaveFile(DataTable dt, string fileName)
{
    var list = new List<IEnumerable<string>>();
    list.Add(dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName));
    list.AddRange(dt.Rows.Cast<DataRow>().Select(x => x.ItemArray.Cast<string>()));
    var lines = list.Select(x => string.Join(";", x));
    System.IO.File.WriteAllLines(fileName, lines);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...