C# 序列在System.Linq.Enumerable.Single[Tsource](IEnumerable';1源)处不包含任何元素

C# 序列在System.Linq.Enumerable.Single[Tsource](IEnumerable';1源)处不包含任何元素,c#,openxml,C#,Openxml,我正在运行一些测试并使用OpenXML,现在我想将数据放入一个数组并保存到各自的内容控件中。我试过了,我得到了这个机会 Sequence contains no Elements at System.Linq.Enumerable.Single[Tsource](IEnumerable'1 source) 使用此源代码: using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFor

我正在运行一些测试并使用OpenXML,现在我想将数据放入一个数组并保存到各自的内容控件中。我试过了,我得到了这个机会

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\*****\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());
            }
        }
    }
}
使用DocumentFormat.OpenXml;
使用DocumentFormat.OpenXml.Packaging;
使用DocumentFormat.OpenXml.Wordprocessing;
使用制度;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
命名空间PopulateContentsOpenXml
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
字符串myfile=@“C:\Users\***\Desktop\DTestDoc.docx”;
string[]writedocata=新字符串[]{FirstName.Text,FileNumber.Text,IDNumber.Text,LastName.Text};
WriteDataToContentControl(myfile,WriteDataATA);
}
私有void writeDataContentControl(字符串文件名,字符串[]数据)
{
尝试
{
使用(WordprocessingDocument doc=WordprocessingDocument.Open(文件名,true))
{
MainDocumentPart mainPart=doc.MainDocumentPart;
foreach(数据中的字符串文本)
{
SdtElement text_block=mainPart.Document.Body.subjections().Where(r=>r.SdtProperties.GetFirstChild().Val==text.Single();
Text to=Text_block.subjects().Single();
to.Text=文本;
mainPart.Document.Save();
MessageBox.Show(“好的,我现在很好!”);
}
}
}
捕获(例外情况除外)
{
Show(“错误:+ex.ToString());
}
}
}
}
我在第39行得到一个例外,就是这一行

SdtElement text_block = mainPart.Document.Body.Descendants<SdtElement>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == text).Single();
SdtElement text_block=mainPart.Document.Body.subjects().Where(r=>r.SdtProperties.GetFirstChild().Val==text).Single();
编辑 这样做

        SdtElement text_block = mainPart.Document.Body.Descendants<SdtElement>().Where(r => r.SdtProperties.GetFirstChild<Tag>().Val == text).SingleOrDefault();

        Text to = text_block.Descendants<Text>().Single();
SdtElement text_block=mainPart.Document.Body.subjects().Where(r=>r.SdtProperties.GetFirstChild().Val==text.SingleOrDefault();
Text to=Text_block.subjects().Single();
我的对象未设置为对象的实例。现在检查后,它说text_block为空


为什么会这样?

有许多Linq扩展方法,如果序列(例如,
IEnumerable
)为空或调用该方法无法实现所做的断言,它们将抛出异常

Single()
如果序列不包含恰好一个元素,则将引发异常。因此,如果序列为空或包含多个元素,则抛出异常。这就是发生在你身上的事。没有具有给定标记值的
SdtElement

如果序列为空,
First()
Last()
也将引发异常。他们希望序列中至少有一个元素

如果您不能保证序列是非空的,这意味着它将确切地或至少包含一个
SdtElement
,那么您应该使用
SingleOrDefault()
或潜在的
FirstOrDefault()

如果序列为空,
SingleOrDefault()
将不会抛出,但如果序列包含多个元素,则会抛出。因此,它最多需要一个元素


FirstOrDefault()
在任何情况下都不会抛出。如果
SdtElement
实例的序列为空,它将返回
null
。如果它不是空的,它将返回第一个
SdtElement
,忽略其他的。因此,它期望零个或多个元素。

结果是什么??mainPart.Document.Body.subjects().Where(r=>r.SdtProperties.GetFirstChild().Val==text);没什么,它没有给出任何结果,只是在messageboxTry中触发了该异常,并中断该语句,检查每个部分的结果。e、 g.……的结果。。。。mainPart.Document.Body.subjections()然后继续。@AzharKhorasany,请查看编辑您编辑了哪些内容?我看不到对OP的任何编辑?SingleOrDefault()和FirstOrDefault()引发此错误,对象未设置为对象的实例您的序列不包含任何元素,这就是
Single()
引发异常的原因。在本例中,
SingleOrDefault()
FirstOrDefault()
都返回
null
。因此,当您使用
SingleOrDefault()
FirstOrDefault()
(或任何可以返回
null
的内容)时,您应该检查
null
,然后不要尝试获取
null
的后代。如果这回答了您的问题,请接受并投票。错误仍然存在,先生。仍在研究它是如何实现的resolved@Ukrainian,您的问题是为什么
Single()
方法引发异常,在尝试
SingleOrDefault()
之后,您添加了“将对象未设置为对象的实例。现在检查后,它表示text_block为null”。我回答了两个问题。您的问题没有涉及任何其他错误或根本原因,您也没有提供任何详细信息。如果您希望我们能够帮助您,您需要提供足够的上下文,最好是一个最小的、可复制的示例。