2011-12-01 10 views
8

का उपयोग कर वर्ड में चेकबॉक्स प्राप्त करें। किसी को ओपनएक्सएमएल का उपयोग करके वर्ड डॉक्यूमेंट में एम्बेडेड चेकबॉक्स नियंत्रण में कैसे संभालता है?ओपनएक्सएमएल

आपको लगता है कि या तो पैराग्राफ। कंट्रोलप्रॉपर्टीजपार्ट या पैराग्राफ। अभ्यर्थी() कुछ हासिल करेंगे लेकिन हर मामले में मुझे एक शून्य प्रकार वापस आ जाएगा।

मैं वास्तविक XML संरचना का उपयोग कर दस्तावेज़ पेड़ को पार कर सकता हूं, लेकिन यह बोझिल लगता है।

सुझावों का स्वागत है।

+0

क्या आप चेक बॉक्स सामग्री नियंत्रण का उपयोग कर रहे हैं? – CoderDennis

उत्तर

10

नीचे दिया गया कोड दिखाता है कि दस्तावेज़ दस्तावेज़ में द्वारा Decendants<CheckBox>() विधि का उपयोग करके दस्तावेज़ दस्तावेज़ में सभी चेकबॉक्सों को कैसे गणना करें।

using (WordprocessingDocument doc = WordprocessingDocument.Open("c:\\temp\\checkbox.docx", true)) 
{ 
    foreach (CheckBox cb in doc.MainDocumentPart.Document.Body.Descendants<CheckBox>()) 
    { 
    Console.Out.WriteLine(cb.LocalName); 

    FormFieldName cbName = cb.Parent.ChildElements.First<FormFieldName>(); 
    Console.Out.WriteLine(cbName.Val); 

    DefaultCheckBoxFormFieldState defaultState = cb.GetFirstChild<DefaultCheckBoxFormFieldState>(); 
    Checked state = cb.GetFirstChild<Checked>(); 

    Console.Out.WriteLine(defaultState.Val.ToString()); 

    if (state.Val == null) // In case checkbox is checked the val attribute is null 
    { 
     Console.Out.WriteLine("CHECKED"); 
    } 
    else 
    { 
     Console.Out.WriteLine(state.Val.ToString()); 
    } 
    } 
} 

किसी दिए गए चेकबॉक्स इनपुट तत्व आप CheckBox उदाहरण के Parent संपत्ति का उपयोग और उसके बाद FormFieldName तत्व के लिए खोज (माइक्रोसॉफ्ट में गुण संवाद का उपयोग एक चेकबॉक्स को नाम निर्दिष्ट करने के लिए किया है के नाम निर्धारित करने के लिए शब्द)।

DefaultCheckBoxFormFieldStateVal संपत्ति चेकबॉक्स के लिए डिफ़ॉल्ट स्थिति रखती है। इसके अलावा Checked तत्व की संपत्ति CheckBox उदाहरण की वास्तविक चेक स्थिति रखती है। नोट, माइक्रोसॉफ्ट वर्ड 2007 के लिए वैल प्रॉपर्टी null है यदि चेकबॉक्स चेक किया गया है।

संपादित

मैं अपने जवाब का विस्तार करना चाहते हैं शुरू करते हैं। वास्तव में, एमएस वर्ड डेवलपर टैब पर दो प्रकार के चेकबॉक्स नियंत्रण होते हैं - एक विरासत चेकबॉक्स और एक ActiveX नियंत्रण चेकबॉक्स। उपरोक्त दिखाया गया कोड किसी शब्द दस्तावेज़ में विरासत चेकबॉक्स को गिनने के लिए उपयोग किया जा सकता है (विरासत चेकबॉक्स बनाने के तरीके पर यह article देखें)।

जहां तक ​​मुझे पता है, आप ActiveX चेकबॉक्स के लिए मान प्राप्त करने/सेट करने के लिए OpenXML SDK का उपयोग नहीं कर सकते हैं। हालांकि आप निम्नलिखित कोड का उपयोग कर ActiveX नियंत्रण की गणना कर सकते हैं:

foreach (Control ctrl in doc.MainDocumentPart.Document.Body.Descendants<Control>()) 
{ 
    Console.Out.WriteLine(ctrl.Id); 
    Console.Out.WriteLine(ctrl.Name); 
    Console.Out.WriteLine(ctrl.ShapeId); 
} 

निर्धारित करने के लिए किया जाए या नहीं एक दिया Control एक चेकबॉक्स आप Control के वर्ग आईडी ckeck करने के लिए है है। चेकबॉक्स की कक्षा आईडी {8BD21D40-EC42-11CE-9E0D-00AA006002F3} है। यहाँ वर्ग आईडी प्राप्त करने के लिए एक कोड नमूना है (मैं अगर वहाँ एक आसान तरीका है पता नहीं है ...):

OpenXmlPart part = doc.MainDocumentPart.GetPartById(ctrl.Id); 
OpenXmlReader re = OpenXmlReader.Create(part.GetStream()); 
re.Read(); 
OpenXmlElement el = re.LoadCurrentElement();   
if(el.GetAttribute("classid", el.NamespaceUri).Value == "{8BD21D40-EC42-11CE-9E0D-00AA006002F3}") 
{ 
    Console.WriteLine("Checkbox found..."); 
} 
re.Close(); 

अंत संपादित

संपादित 2

मुझे एहसास नहीं हुआ कि वर्ड 2010 में एक नया चेकबॉक्स नियंत्रण है (डेनिस पामर के लिए धन्यवाद)।

उन नए चेकबॉक्स को नियंत्रित करता है आप निम्नलिखित कोड का उपयोग कर सकते गणना करने के लिए:

using (WordprocessingDocument doc = WordprocessingDocument.Open(filename, true)) 
{ 
    MainDocumentPart mp = doc.MainDocumentPart; 

    foreach(SdtContentCheckBox cb in mp.Document.Body.Descendants<SdtContentCheckBox>()) 
    {   
    if(cb.Checked.Val == "1"); 
    { 
     Console.Out.WriteLine("CHECKED"); 
    }   
    } 
} 

अंत संपादित 2

आशा, इस मदद करता है।

+0

यही वह है जो मैंने काम करने की उम्मीद की होगी, सिवाय मेरे कोड में रखे गए तीन चेकबॉक्स को अभी भी उठाया नहीं जा रहा है। मैं अपने जीवन के लिए नहीं कर सकता कि मैंने क्या किया है। जब तक विभिन्न प्रकार के चेकबॉक्स नहीं होते हैं। मैंने एक नमूना दस्तावेज़ बनाया है और डेवलपर टैब में नियंत्रण समूह से चेकबॉक्स डाले हैं। –

+0

@ फिल.Wheeler: क्या आप ActiveX चेकबॉक्स या विरासत चेकबॉक्स नियंत्रण का उपयोग करते हैं? नोट, ऊपर दिया गया कोड केवल विरासत चेकबॉक्स के साथ काम करता है। – Hans

+0

मैं कहूंगा कि यह ActiveX नियंत्रण था। यह उद्देश्य के लिए बनाया गया एक नया दस्तावेज़ है और वर्ड 2010 में डेवलपर टैब के माध्यम से चेकबॉक्स जोड़ा गया था। मुझे नहीं पता कि विरासत नियंत्रण कैसे समीकरण में दिखाई देगा। –

संबंधित मुद्दे