मेरे पास कुछ खाली पंक्तियों वाली एक टेबल वाला एक सुपर सरल दस्तावेज़ है और मैं सभी पंक्तियों को हटाने की कोशिश कर रहा हूं। (उद्देश्य वास्तव में केवल रिक्त पंक्तियों को अंततः हटाना है, लेकिन मुझे किसी भी पंक्ति को हटाने के साथ कोई भाग्य नहीं था)।

public static void SearchAndReplace(string document)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(document, true))
            {
               var body = doc.MainDocumentPart.Document.Body;
                foreach (var table in body.Elements<Table>())
                {
                    foreach (var row in table.Elements<TableRow>())
                    {
                        table.RemoveChild<TableRow>(row);
                        continue;

                    }
                }             
                doc.Save();
            }
        }

दस्तावेज़ में एक पृष्ठ है, जिसमें चार पंक्तियों वाली केवल एक तालिका है, लेकिन उपरोक्त किसी कारण से किसी भी पंक्ति को नहीं हटाता है।

मैंने भी कोशिश की है

row.Remove()

इसका भी कोई प्रभाव नहीं पड़ता है, यानी इसे चलाने के बाद कोई पंक्ति नहीं हटाई जाती है। कोई विचार इसमें क्या गलत है? यह मेरा दस्तावेज़ कैसा दिखता है

enter image description here

धन्यवाद

2
LePrinceDeDhump 21 मार्च 2020, 17:18

1 उत्तर

सबसे बढ़िया उत्तर

अपने पहले प्रयास में, आपने OpenXmlElement.Elements<T>() विधि द्वारा निर्मित IEnumerable<TableRow> का उपयोग किया, जो आपके Table के ChildElements के संग्रह से TableRow उदाहरणों की गणना करता है। ChildElements के उस संग्रह की गणना गतिशील रूप से की जाती है और उदाहरण yield return का उपयोग करके लौटाए जाते हैं। ऐसा तब होता है जब आप तत्वों को हटाकर ChildElements के उस संग्रह को बदलते हैं,

  1. जिसका मतलब है कि आप बच्चों और उनके माता-पिता और भाई-बहनों के बीच की कड़ी तोड़ रहे हैं,
  2. जिसका अर्थ है कि आपको TableRow तत्वों का पूरा सेट नहीं मिलता है,
  3. जिसका अर्थ है कि आप TableRow इंस्टेंस को हटा नहीं सकते।

हालांकि, मुझे लगता है कि आपको पहले TableRow इंस्टेंस को हटाने में सक्षम होना चाहिए।

ToList() का उपयोग करके, आप TableRow उदाहरणों के संग्रह को अमल में लाते हैं और उन सभी को एक अलग List<TableRow> में पकड़ लेते हैं। इस तरह, आप एक निश्चित संग्रह पर काम कर रहे हैं, न कि एक जो गतिशील रूप से गणना की जाती है जैसे आप जाते हैं। और यही कारण है कि यह काम करता है।

एक सामान्य नियम के रूप में, आपको कभी भी किसी संग्रह को नहीं बदलना चाहिए (जैसे, संग्रह के तत्वों को हटाकर) जिसे आप गणना करते हैं।

2
Thomas Barnekow 22 मार्च 2020, 11:47