#c# #list #winforms
#c# #Список #winforms
Вопрос:
Я внедрил систему списков, в которой записываются имена пользователей, общее количество набранных ими баллов и количество времени, затраченное на это. Теперь у меня возникли проблемы при попытке отобразить список «игроки» из другого класса. Итак, в моей форме HighScoresMenu при попытке отобразить содержимое списка игроков в окне списка в окне списка отображается только «Игра.Проигрыватель».
Есть ли какие-либо возможные решения этой проблемы. Буду признателен за любую помощь.
public partial class MainMenu : Form
{
public static List<Player> GetPlayers(float newScore, float newPoints,
string PlayersName)
{
var players = new List<Player>();
var newPlayer = new Player
{
Name = PlayersName,
Points = newPoints,
Timer = newScore
};
players.Add(newPlayer);
var TopTenLevel1 = players.OrderByDescending(x => x.Timer).Take(10);
return players;
}
}
public partial class HighScoresMenu : Form
{
foreach (var players in MainMenu.GetPlayers(newScore, newPoints,
PlayersName))
{
ListBoxLevel1.Items.Add(players);
}
}
Комментарии:
1. Вам придется указать listbox, из каких полей в классе Player читать и использовать для отображения, он не может угадать
2. Я не знаю, как решить вашу проблему, но в этом случае вам не нужно упорядочивать и создавать список, потому что вы всегда создаете только один объект. Вы могли бы вернуть только заполненный объект и удалить «foreach».
3. Я считаю, что синтаксис неправильный, ваш цикл foreach является окружающим в классе. Разве это не должно быть в методе? или это предполагается?
4. Либо установите DisplayMember в вашем ListBox, либо переопределите toString() для вашего
Player
класса, чтобы управлять тем, как он выглядит как запись в ListBox.
Ответ №1:
Хорошо, для начала я, возможно, неправильно понял ваш вопрос. Что я получаю из этого, так это то, что в вашем представлении списка отображается имя объекта, отсюда и «Игра.Проигрыватель». Итак, вам придется изменить следующее:
ListBoxLevel1.Items.Add(players);
к чему-то вроде следующего:
ListBoxLevel1.Items.Add($"Player: {players.Name}, Score: {players.Points}");
Я не уверен, что ваше поле списка принимает в качестве параметра в Items.Add();
методе, поэтому в этом ответе предполагается, что это строка.
Ответ №2:
У меня также была эта проблема несколько лет назад: функция GetPlayers статична, это означает, что содержимое (значение) или переменная недоступны из других классов.
Вам нужно удалить ‘static’ и запустить MainMenu в классе HighScoresMenu следующим образом:
//MainMenu
public static List<Player> GetPlayers(float newScore, float newPoints, string PlayersName)
//HighScoreMenu
MainMenu main = new MainMenu();
menu.GetPlayers(newScore, newPoints, PlayersName);
Я надеюсь, что это устранит проблему (удаление ключевого слова ‘static’ из функции и запуск класса MainMenu)
Я был бы рад услышать, решена ли текущая ситуация или нет. 🙂 Надеюсь, я это хорошо запомнил.
Редактировать
После того, как я взглянул еще раз, вы выполняете цикл foreach в качестве var player. Но зацикливайте его как Player player. Потому что вы вставили в другой класс объект Player внутри списка игроков. Теперь вы извлекаете его как переменную.**
Итак, окончательный вывод:
public partial class HighScoresMenu : Form
{
foreach (Player players in MainMenu.GetPlayers(newScore, newPoints,
PlayersName))
{
ListBoxLevel1.Items.Add(players.getName());
}
}
Мне любопытно, дайте мне знать: D
Правка 2
Также сообщаю вам на случай, если вы никогда не узнаете. Вы всегда создаете только один проигрыватель, поэтому на самом деле список не нужен, и этот фрагмент кода:
var TopTenLevel1 = players.OrderByDescending(x => x.Timer).Take(10);
Это упорядочит его, но вы ничего с ним не делаете (var ‘TopTenLevel1’). Просто сообщаю вам 🙂 Вы могли бы сохранить упорядоченный список, вернув его (также возможна перезапись переменной).