Нужна помощь в заполнении списка со значением json, в настоящее время отображаются пустые значения - PullRequest
0 голосов
/ 16 марта 2020

Я полностью новичок в программировании, я пытаюсь создать что-то вроде инструмента организации манги в формах windows, но я застреваю при заполнении списка с данными из десериализованной строки json, в настоящее время он отображает только логические значения. правильно все остальные значения являются "0" четными строками. У меня есть кнопка, чтобы сделать это:

using (OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "Json Files|*.json", ValidateNames = true, Multiselect = false })
{
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        var fileStream = openFileDialog.OpenFile();
        using (StreamReader sr = new StreamReader(fileStream))
        {
            string fileContent = sr.ReadToEnd();
            ComicList comics = JsonConvert.DeserializeObject<ComicList>(fileContent);
            Manga_listBox.DataSource = DisplayComic.FullList;


            //ignore this little bit it's just so i can see what's happening
            label1.Text = Convert.ToString(comics.Comics.Count);
            label1.Text = Convert.ToString(DisplayComic.FullList);
        }
    }
}

, и у меня есть следующие классы, такие как:

public class Comic
{
    private string Manga;
    private int Chapters;
    private bool isFinished;
    private int LastReadCH;

    public string Manga1 { get => Manga; set => Manga = value; }
    public int Chapters1 { get => Chapters; set => Chapters = value; }
    public bool IsFinished { get => isFinished; set => isFinished = value; }
    public int LastReadCH1 { get => LastReadCH; set => LastReadCH = value; }



    public Comic(Comic asd)
    {
        this.Manga = Manga1;
        this.Chapters = Chapters1;
        this.IsFinished = IsFinished;
        this.LastReadCH = LastReadCH1;
    }
    public override string ToString()
    {
        return string.Format("{0}, {1}, {2}, {3}",
                this.Manga, this.Chapters, this.IsFinished, this.LastReadCH);
    }

}

и

public class ComicList
{
    private List<Comic> comics;

    public List<Comic> Comics { get => comics; set => comics = value; }

}

и

public class DisplayComic
{
    static DisplayComic()
    {
        using (OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "Json Files|*.json", ValidateNames = true, Multiselect = false })
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                var fileStream = openFileDialog.OpenFile();
                using (StreamReader sr = new StreamReader(fileStream))
                {
                    string fileContent = sr.ReadToEnd();
                    ComicList comics = JsonConvert.DeserializeObject<ComicList>(fileContent);
                    FullList = comics.Comics;


                }
            }
        }
    }

    private static List<Comic> fullList;

    public static List<Comic> FullList { get => fullList; set => fullList = value; }

    public static List<Comic> GetComcis()
    {
        return FullList;
    }


}

код, вероятно, довольно запутанный, но опять же я совершенно новый и отслеживаю всю информацию в Интернете, также по какой-то причине открытый диалог windows открывается дважды, я не понимаю, почему. вот файл json, который я использую:

{
  "Comics": [
    {
      "Manga": "MangaNumber1",
      "Chapters": 85,
      "isFinished": true,
      "LastReadCH": 85
    },
    {
      "Manga": "MangaNumber2",
      "Chapters": 112,
      "isFinished": true,
      "LastReadCH": 112
    },
    {
      "Manga": "MangaNumber3",
      "Chapters": 117,
      "isFinished": true,
      "LastReadCH": 117
    },
    {
      "Manga": "MangaNumber4",
      "Chapters": 74,
      "isFinished": true,
      "LastReadCH": 74
    }
  ]
}

Я пробовал почти все, кто мог бы, с моим «опытом», меняя все виды имен переменных и т. д., был бы очень признателен за помощь .

вот скриншот проблемы: поскольку вы можете видеть, что только логические значения на самом деле верны, в противном случае они будут ложными, хотя все остальные значения ...

РЕДАКТИРОВАТЬ: результат, который я ищу, состоит в том, чтобы заполнить список именами манги (спасибо @beeker за это свойство), и как только я выбрал указанную мангу, я хочу создать некоторые другие объекты, такие как метки и текстовые поля, чтобы просматривать и редактировать значения глав et c, также я хотел бы иметь возможность видеть, что анализируется файлом json, когда я делаю это:

                        label1.Text = Convert.ToString(comics);

я получаю метка с текстом "Manga_Organizer_2.ComicList"

Кстати, когда я говорю, что я новичок, я имею в виду, что я когда-либо делал вещи только с консольными приложениями, используя только функции "if", весь этот разбор json, openfiledialog, а также даже использование классов совершенно новое. У меня также нет опыта программирования на любом другом языке c# - это первое, и я люблю его, хотя и испытываю ужасные трудности:)

Ответ / Обновление: теперь все хорошо :) все, что мне нужно было сделать, это установите

                        DisplayComic.FullList = comics.Comics;

в openfiledialog прямо перед настройкой источника данных для списка. В конце это выглядит так:


                        string fileContent = sr.ReadToEnd();
                        ComicList comics = JsonConvert.DeserializeObject<ComicList>(fileContent);
                        DisplayComic.FullList = comics.Comics;
                        Manga_listBox.DataSource = DisplayComic.FullList;
                        Manga_listBox.DisplayMember = "manga";

также полностью удаляет инкапсуляции в классе comi c, в конце это выглядит так:

    public class Comic
    {
        public string Manga { get; set; }
        public double Chapters { get; set; }
        public bool IsFinished { get; set; }
        public double LastReadCH { get; set; }
        public string StartedOn { get; set; }
        public string FinishedOn { get; set; }

    }

, а также Класс displaycomi c выглядит следующим образом:

    public class DisplayComic
    {
        public static List<Comic> FullList { get; set; }


        public static List<Comic> GetComcis()
        {
            return FullList;
        }
    }

Кроме того, после того, как эта проблема возникла еще больше, я мог десериализовать json, проанализировать его в строку, а затем в список, загрузить, сохранить и редактировать его, и мне также удалось сериализовать его обратно вместе и с помощью savefiledialog создать файл для него, однако, когда я это сделаю, я не смог бы повторно десериализовать его еще раз, что-то в json изменилось (с объект к массиву или наоборот), кроме того, у меня также были проблемы с датой и временем, я не мог правильно загрузить его из строки и т. д., в любом случае, после множества неудач и почти 17 часов просмотра кода с озадаченным лицом я закончил свое приложение: D! Он делает все, что я хочу, загрузить json, сохранить и отредактировать его, собрать обратно, добавить и удалить из него, и я многому научился от всех этих проблем, спасибо всем за помощь, спасибо вам, ребята узнал, как настроить элементы для отображения в списках, а также, что очень важно, «немного» научился отлаживать код. Спасибо.

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Ответ: я удалил весь этот openfiledialog в классе comi c отображения, переименовал инкапсуляции в классе Comi c и сделал: D, теперь openfiledialog открывается только один раз, и значения из json обрабатываются правильно проанализирован в списке комиксов, что позволяет мне использовать их, однако я хочу, спасибо, вы подтолкнули меня в правильном направлении с идеей изучать отладочные материалы: D. Теперь все, что осталось, это научиться создавать объекты, выбирая разные строки из списка, еще один вызов ждет этого новичка.

0 голосов
/ 16 марта 2020

Попробуйте установить свойство списка «DisplayMember», чтобы элемент управления знал, какое свойство класса вы хотите видеть. Примерно так ...

Manga_listBox.DataSource = DisplayComic.FullList;
Manga_listBox.DisplayMember = "Manga";

Ссылка: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listcontrol.displaymember?view=netframework-4.8

...