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

#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’). Просто сообщаю вам 🙂 Вы могли бы сохранить упорядоченный список, вернув его (также возможна перезапись переменной).