Как заполнить мою DataGrid списком C #, содержащим мои данные XML, которые были проанализированы с помощью XML Node Reader? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть данные в моем XML-файле, которые я собрал, прочитав мой XML-файл и сохранив мои данные, основанные на каждом узле, в объекте.

Я хочу заполнить свою DataGrid данными из моего Списка (jobList), но я не уверен, что я делаю неправильно.

Динамическое построение таблицы и добавление данных.Построение XML вручную.

    public partial class amgrid : Window
    {
        public static Configuration AppSettings { get; set; }
        JobList job = new JobList();

        public amgrid()
        {
            InitializeComponent();
            XmlDocument doc = new XmlDocument();
            string docPath = @"C:\Users\contract_lshamoon\Desktop\arm\arm\arm\xmldb.xml";
            doc.Load(docPath);
            XmlElement root = doc.DocumentElement;
            XmlNodeList elemList = root.GetElementsByTagName("Jobs");
            findAllNodes(root);
            doc.Save(@"C:\Users\contract_lshamoon\Desktop\arm\arm\arm\xmldb.xml");
            DG.DataContext = job;

        }

        int index = 0;
        public void findAllNodes(XmlNode node)
        {
            index++;
            foreach (XmlNode n in node)
                findAllNodes(n);

            if (node.Name == "Job")
            {
                job.Job = index.ToString();
                Console.WriteLine();
                Console.WriteLine("job.Job" + " : " + index + " : " + job.Job);
            }
            if (node.Name == "JobDate")
            {
                job.JobDate = node.InnerText;
                Console.WriteLine("Job.JobDate" + " : " + job.JobDate);
            }
            if (node.Name == "File")
            {
                job.File = node.InnerText;
                Console.WriteLine("Job.File" + " : " + job.File);
            }
            if (node.Name == "FilePath")
            {
                job.FilePath = node.InnerText;
                Console.WriteLine("Job.FilePath" + " : " + job.FilePath);
            }
            if (node.Name == "Extension")
            {
                job.Extension = node.InnerText;
                Console.WriteLine("Job.Extension" + " : " + job.Extension);
            }
            if (node.Name == "Age")
            {
                job.Age = node.InnerText;
                Console.WriteLine("Job.Age" + " : " + job.Age);
            }
            if (node.Name == "JobComment")
            {
                job.JobComment = node.InnerText;
                Console.WriteLine("Job.JobComment" + " : " + job.JobComment);
            }
        }

        private List<JobList> LoadCollectionData()
        {
            List<JobList> jobList = new List<JobList>();

            jobList.Add(new JobList()
            {
                Job = job.Job,
                JobDate = job.JobDate,
                FilePath = job.FilePath,
                Extension = job.Extension,
                Age = job.Age,
                JobComment = job.JobComment
            });

            return jobList;
        }
    }

    public class JobList
    {
        [XmlAttribute("JobId")]
        public string Job { get; set; }
        [XmlElement("JobDate")]
        public string JobDate { get; set; }
        [XmlElement("File")]
        public string File { get; set; }
        [XmlElement("FilePath")]
        public string FilePath { get; set; }
        [XmlElement("Extension")]
        public string Extension { get; set; }
        [XmlElement("Age")]
        public string Age { get; set; }
        [XmlElement("JobComment")]
        public string JobComment { get; set; }
    }

    <Grid>
        <DataGrid x:Name="DG" ItemsSource="{Binding jobList}">
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="JobCol" Binding="{Binding Job}" Header="Job"/>
                <DataGridTextColumn x:Name="JobDateCol" Binding="{Binding JobDate}" Header="Date"/>
                <DataGridTextColumn x:Name="FilePathCol" Binding="{Binding FilePath}" Header="Path"/>
                <DataGridTextColumn x:Name="ExtensionCol" Binding="{Binding Extension}" Header="Extension"/>
                <DataGridTextColumn x:Name="AgeCol" Binding="{Binding Age}" Header="Age"/>
                <DataGridTextColumn x:Name="JobCommentCol" Binding="{Binding JobComment}" Header="Comment"/>
            </DataGrid.Columns>

        </DataGrid>
    </Grid>

Я просто хочу, чтобы в каждой строке отображался каждый элемент списка.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Тип job, JobList, не является списком, как следует из его типа.Он содержит только свойства одного задания.У вас есть только один экземпляр этого класса, и он назначен на job.Каждый раз, когда вы сталкиваетесь с узлом, вы изменяете свойства этого экземпляра.

Когда вы пытались DB.Items.Add(job);, вы добавляли этот же экземпляр в список элементов сетки, поэтому, естественно, он будет отображать этот элемент Nраз.Более того, это будет совокупный результат значений, которые вы присвоили этим свойствам (то есть последнее значение, записанное для каждого свойства).

Если я правильно понимаю вашу структуру (что сложно, потому что вы не показалиобразец XML), вы перемещаетесь по узлам XML и относитесь ко всем типам узлов одинаково (включая элементы и атрибуты).Если, например, у вас есть только два элемента, где один элемент имеет только атрибут JobDate, а другой элемент имеет только атрибут FilePath, job в конечном итоге будет иметь оба назначенных свойства, и обе строки будут отображать эти два значения,Он не будет отображать одну строку с одним значением и другую строку с другим значением, поскольку у вас нет экземпляров, которые были помещены в эти состояния.

Другая проблема заключается в том, что вам не хватает идеи, что элемент должен отображатьсяк экземпляру JobList, и атрибуты должны соответствовать свойствам этого экземпляра.findAllNodes - это (возможно) хороший алгоритм для обхода узлов XML, но без различий в типах узлов он не выполняет то, что вам нужно, с целью загрузки данных.В частности, в некоторых типах узлов вам нужно создать экземпляр JobList, а в других - присвоить значения его свойствам.XML-сериализация является лучшим вариантом здесь, потому что она сделает все это за вас.У вас даже есть атрибуты для него в свойствах, так что продолжайте и используйте его.

У вас также есть метод с именем LoadCollectionData, но вы никогда не вызываете его (или, по крайней мере, вы не показали, что выЗвоню куда угодно).Этот метод возвращает список элементов, но он добавляет к нему единственный экземпляр JobList, который вы когда-либо создавали, тот, который находится в вашем поле job.

Если вы исключитев поле job (строка, которая читает JobList job = new JobList();), вы начнете получать ошибки там, где вы использовали этот экземпляр.Это сломает ваш код, но, надеюсь, это также покажет вам, где вы должны создавать новые экземпляры (или принимать экземпляры в качестве параметров).

Некоторые дополнительные примечания к обзору:

  • Вы сохраняете XML-документ обратно на диск, не изменяя его.Вы можете безопасно удалить вызов doc.Save.
  • Загрузка данных в конструкторе, вероятно, не очень хорошая идея.Я не эксперт WPF (и я даже не играю по телевизору), но вы должны искать событие «load» для обработки или что-то в этом роде.В конце концов, вы захотите использовать async, чтобы ваш пользовательский интерфейс мог реагировать при загрузке.
  • Как правило, не объявляйте переменную, пока она вам не понадобится.Когда вы объявляете переменную и позволяете ей «гнить» до тех пор, пока вы ее не используете, вы позволяете себе делать ошибки в последовательности выполнения, что может привести к таким вещам, как NullReferenceException s, когда вы забудете, что еще не инициализировали ее.И не рекламируйте его в поле, пока не узнаете, что это должно быть поле.

Поскольку ответы идут, это примерно столько, сколько я могу сказать, потому что код, который вы предоставили, немного сложен иваше намерение не совсем ясно.Я желаю вам удачи в применении вышеуказанной информации.

0 голосов
/ 03 апреля 2019
    public class JobList
    {
        [XmlElement("Job")]
        public string Job { get; set; }
        [XmlElement("JobDate")]
        public string JobDate { get; set; }
        [XmlElement("File")]
        public string File { get; set; }
        [XmlElement("FilePath")]
        public string FilePath { get; set; }
        [XmlElement("Extension")]
        public string Extension { get; set; }
        [XmlElement("Age")]
        public string c { get; set; }
        [XmlElement("JobComment")]
        public string JobComment { get; set; }
    }

    public partial class amgrid : Window
    {
        public amgrid()
        {
            InitializeComponent();

            XmlDocument doc = new XmlDocument();
            string docPath = @"C:\Users\contract_lshamoon\Desktop\arm\arm\arm\xmldb.xml";
            doc.Load(docPath);
            XmlElement root = doc.DocumentElement;
            XmlNodeList elemList = root.GetElementsByTagName("Jobs");
            findAllNodes(root);
            doc.Save(@"C:\Users\contract_lshamoon\Desktop\arm\arm\arm\xmldb.xml");
        }

        public void findAllNodes(XmlNode node)
        {
            foreach (XmlNode n in node)
            {
                JobList jobs = new JobList();

                string job = n.Attributes["JobId"].Value;
                string date = n.FirstChild.InnerText;
                string file = n.FirstChild.NextSibling.InnerText;
                string path = n.FirstChild.NextSibling.NextSibling.InnerText;
                string extension = n.FirstChild.NextSibling.NextSibling.NextSibling.InnerText;
                string age = n.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.InnerText;
                string comment = n.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.InnerText;

                jobs.Job = job;
                jobs.JobDate = date;
                jobs.File = file;
                jobs.FilePath = path;
                jobs.Extension = extension;
                jobs.c = age;
                jobs.JobComment = comment;

                DG.DataContext = jobs;
                DG.Items.Add(jobs);
            }
        }
    }
        <DataGrid x:Name="DG">
            <DataGrid.DataContext>
                <local:JobList/>
            </DataGrid.DataContext>
            <DataGrid.Columns>
                <DataGridTextColumn x:Name="JobCol" Binding="{Binding Job}" Header="Job"/>
                <DataGridTextColumn x:Name="JobDateCol" Binding="{Binding JobDate}" Header="Date"/>
                <DataGridTextColumn x:Name="FilePathCol" Binding="{Binding FilePath}" Header="Path"/>
                <DataGridTextColumn x:Name="ExtensionCol" Binding="{Binding Extension}" Header="Extension"/>
                <DataGridTextColumn x:Name="AgeCol" Binding="{Binding Age}" Header="Age"/>
                <DataGridTextColumn x:Name="JobCommentCol" Binding="{Binding JobComment}" Header="Comment"/>
            </DataGrid.Columns>

        </DataGrid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...