Проблема с выводом рекорда C#

364
03 июня 2017, 13:42

Суть в том, что у меня есть игровое приложение. Есть текстовый файл в котором хранятся рекорды

На первом изображении как загружаются рекорды , а на втором - как выглядит рекорд в текстовом файле

Вот не знаю как нормально загрузить рекорды.

Сама функция:

     // Загрузка рекордов из файла
    private void loadPlayerDataButtom_Click(object sender, EventArgs e)
        {
        if (File.Exists(dataFilePath))
        {
            string[] data = File.ReadAllLines(dataFilePath);
            foreach (string dataItem in data)
            {
                ListViewItem newListViewItem = new ListViewItem(dataItem);
                newListViewItem.SubItems.Add(dataItem);
                newListViewItem.SubItems.Add(dataItem);
                recordsDataListView.Items.Add(newListViewItem);
            }
            if (clearPlayerDataButton.Enabled == false)
            {
                clearPlayerDataButton.Enabled = true;
            }
            MessageBox.Show(this, "Данные успешно загружены.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
        else
        {
            MessageBox.Show(this, "Файл не найден!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

Answer 1

Вот попробуйте:

// Загрузка рекордов из файла
private void loadPlayerDataButtom_Click(object sender, EventArgs e)
{
    if (File.Exists(dataFilePath))
    {
        string[] data = File.ReadAllLines(dataFilePath);
        var items = new List<string>();
        for (var i = 0; i < data.Length; i++)
        {
            string dataItem = data[i];
            if (!string.IsNullOrWhiteSpace(dataItem))
            {
                items.Add(dataItem);
                if (i < data.Length - 1)
                    continue;
            }
            if (items.Count != 3)
                continue;
            var newListViewItem = new ListViewItem(items[0]);
            newListViewItem.SubItems.Add(items[1]);
            newListViewItem.SubItems.Add(items[2]);
            recordsDataListView.Items.Add(newListViewItem);
            items.Clear();
        }
        if (clearPlayerDataButton.Enabled == false)
        {
            clearPlayerDataButton.Enabled = true;
        }
        MessageBox.Show(this, "Данные успешно загружены.", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    else
    {
        MessageBox.Show(this, "Файл не найден!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
Answer 2

Позвольте, я покажу другой подход.

Для начала, создадим модель данных:

public class Record
{
    public string Name { get; set; }
    public int Score { get; set; }
    public TimeSpan Time { get; set; }
}

Для работы с набором записей объявляем коллекцию (можно любой другой подходящий тип - например, BindingList):

List<Record> records; // поле формы

Заполним её тестовыми данными (ниже показано чтение из файла):

records = new List<Record>
{
    new Record { Name="Test",  Score=1200, Time=new TimeSpan(0,0,12) },
    new Record { Name="Test1", Score=1600, Time=new TimeSpan(0,0,8)  },
    new Record { Name="Test2", Score=1800, Time=new TimeSpan(0,0,6)  }
};

Теперь с коллекцией можно удобно работать.

Добавление записи:

records.Add(new Record { Name="test3", Score=2000, Time=new TimeSpan(0, 0, 10) });

Поиск:

var maxScore = records.Max(r => r.Score); // наибольший счёт
var maxRecord = records.Find(r => r.Score == maxScore); // запись с наибольшим счётом

Удаление записи:

records.Remove(maxRecord);

И т. п.

Для сохранения в файл и чтения оттуда проще всего использовать сериализацию. Например, в JSON. Возьмём для этого популярную библиотеку JSON.NET (подключите через nuget).

using Newtonsoft.Json; // открываем пространство имён

Сохранение делается несолькими строками кода:

// Настраиваем вывод с отступами для читаемости
var settings = new JsonSerializerSettings();
settings.Formatting = Newtonsoft.Json.Formatting.Indented;
var json = JsonConvert.SerializeObject(records, settings);
File.WriteAllText("test.json", json);

Так будет выглядеть файл:

[
  {
    "Name": "Test",
    "Score": 1200,
    "Time": "00:00:12"
  },
  {
    "Name": "Test1",
    "Score": 1600,
    "Time": "00:00:08"
  },
  {
    "Name": "Test2",
    "Score": 1800,
    "Time": "00:00:06"
  }
]

Десериализуются данные тоже элементарно:

var text = File.ReadAllText("test.json");
records = JsonConvert.DeserializeObject<List<Record>>(text);

А для отображения следует использовать привязку данных:

dataGridView.DataSource = records;

Я взял DataGridView, так как он больше подходит для показа табличных данных.

Напоследок, поменяем заголовки грида:

dataGridView.Columns["Name"].HeaderText = "Имя";
dataGridView.Columns["Score"].HeaderText = "Счёт";
dataGridView.Columns["Time"].HeaderText = "Время";
READ ALSO
Как сравнить две таблицы?

Как сравнить две таблицы?

Используется C# MySql

437
Обработка событий стилуса на ListView

Обработка событий стилуса на ListView

Все события сенсорного взаимодействия порождают соответствующие события мышиТак, для Grid достаточно подписаться на MouseDown (можно как на Right button,...

249
кастомизация стиля контрола

кастомизация стиля контрола

Есть некий контрол, а именно TextBox

216
Первый элемент ComboBox

Первый элемент ComboBox

Допустим у меня есть некий ComboBox, у которого будет задача не по назначениюДопустим первый элемент этого ComboBox должен быть всегда надпись "Выберите...

258