Суть в том, что у меня есть игровое приложение. Есть текстовый файл в котором хранятся рекорды
На первом изображении как загружаются рекорды , а на втором - как выглядит рекорд в текстовом файле
Вот не знаю как нормально загрузить рекорды.
Сама функция:
// Загрузка рекордов из файла
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);
}
}
Вот попробуйте:
// Загрузка рекордов из файла
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);
}
}
Позвольте, я покажу другой подход.
Для начала, создадим модель данных:
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 = "Время";
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Все события сенсорного взаимодействия порождают соответствующие события мышиТак, для Grid достаточно подписаться на MouseDown (можно как на Right button,...
Допустим у меня есть некий ComboBox, у которого будет задача не по назначениюДопустим первый элемент этого ComboBox должен быть всегда надпись "Выберите...