Kayman Luther Ответов: 2

Последовательность не содержит элементов в system.linq.enumerable.single[tsource](ienumerable'1 source)


Я запускаю некоторый тест и с помощью OpenXML теперь хочу получить данные в массив и сохранить их в соответствующих элементах управления контентом. Я пробовал и получаю это execption

Sequence contains no Elements at System.Linq.Enumerable.Single[Tsource](IEnumerable'1 source)


У меня есть этот исходный код

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PopulateContentsOpenXml
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string myfile = @"C:\Users\Emeka.Iwuagwu\Desktop\DTestDoc.docx";
            string[] writeDocData = new string[] {FirstName.Text,FileNumber.Text,IDNumber.Text,LastName.Text };
            WriteDataToContentControl(myfile, writeDocData);
        }

        private void WriteDataToContentControl(string filename,string[]data)
        {
            try
            {
                using (WordprocessingDocument doc = WordprocessingDocument.Open(filename, true))
                {
                    MainDocumentPart mainPart = doc.MainDocumentPart;
                    foreach (string text in data) 
                    {
                        SdtElement text_block = mainPart.Document.Body.Descendants<SdtElement>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == text).Single();
                        Text to = text_block.Descendants<Text>().Single();
                        to.Text = text;
                        mainPart.Document.Save();
                        MessageBox.Show("Ok i am fine now!");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error: " + ex.ToString());
            }
        }
    }
}


Что мне кажется, я что - то упускаю?

Что я уже пробовал:

Я пробовал использовать
SdtElement text_block = mainPart.Document.Body.Descendants<SdtElement>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == text).Single();
Но мне все еще кажется, что я что-то упускаю, что я, кажется, упускаю?

2 Ответов

Рейтинг:
2

phil.o

Enumerable.Single метод будет выдавать исключение всякий раз, когда коллекция не содержит ни одного элемента (т. е. коллекция пуста или содержит более одного элемента). Вы, вероятно, должны использовать Enumerable.SingleOrDefault метод, который вернет null вместо того, чтобы создавать исключение.

Теперь, как знать, почему коллекция не содержит только один элемент, я не могу сказать. Лучше всего было бы, вероятно, поставить точку останова на линии SdtElement text_block = ... и запустите сеанс отладки (F5 в Visual Studio). После этого вы сможете просмотреть содержимое Descendants соберите и исследуйте, почему вы не получаете то, что ожидаете.

В конце концов, мы можем предоставить ссылки на то, как провести сеанс отладки. Вам нужна помощь при выполнении сеанса отладки?


Kayman Luther

Показано объекта не задана ссылка на экземпляр объекта, после изменения метода singleordefault()

phil.o

То же замечание: это означает, что коллекция не содержит ни одного элемента. Пришло время начать отладку :)

Kayman Luther

Я получаю этот текст в = text_block.Потомки<text>().Single(); as Null
Почему это так?

phil.o

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

Kayman Luther

Я могу отправить код и файл Docx, чтобы вы могли сами просмотреть его, пожалуйста.

phil.o

Нет, извините, это не так работает. Почему бы вам вместо этого не научиться отлаживать себя?

Kayman Luther

Я есть, и у меня нет прогресса.

phil.o

Опять же, нужна ли вам помощь в том, как правильно провести сеанс отладки?

Kayman Luther

Я буду только рад

phil.o

Эта статья Освоение отладки в Visual Studio 2010 - руководство для начинающих[^] познакомит вас с необходимой информацией для новичка-отладчика.
Как я уже говорил вам в своем ответе: поставьте точку останова, нажмите клавишу F5, после чего вы можете начать следить за тем, что содержится в Descendants соберите и выясните, какой фильтр позволит вам получить ожидаемый результат.

Kayman Luther

Пожалуйста, Смотрите Раздел Правки

Рейтинг:
0

Pete O'Hanlon

Single() подразумевает, что элемент возвращается из XML-выборки. Что происходит, если нет соответствующего элемента? Если есть вероятность, что у вас не будет возвращенного значения, вы должны использовать SingleOrDefault() вместо.


Kayman Luther

Показано объекта не задана ссылка на экземпляр объекта, после изменения метода singleordefault()

Pete O'Hanlon

Если вы говорите об обработке, которая происходит после SingleOrDefault, то так оно и будет. Вам нужно проверить, является ли text_block нулевым, прежде чем пытаться что-либо с ним сделать.

Kayman Luther

Я получаю этот текст в = text_block.Потомки<text>().Single(); as Null
Почему это так?

Pete O'Hanlon

Когда вы получаете null обратно здесь, это указывает на то, что у вас нет соответствующих элементов, возвращаемых.

Kayman Luther

Но я поместил его в виде массива, и имя текстового поля соответствует элементам управления содержимым, помещенным в документ Word. Предполагается, что он должен получить все, что было написано внутри текстового поля, в элемент управления содержимым

Я просто заблудился здесь.