2011-12-01 19 views
8

Làm thế nào để có được một điều khiển cho một hộp kiểm kiểm soát được nhúng trong một tài liệu Word bằng cách sử dụng OpenXML?Nhận một Hộp kiểm trong Word bằng cách sử dụng OpenXML

Bạn sẽ nghĩ rằng Paragraph.ControlPropertiesPart hoặc Paragraph.Descendents() sẽ đạt được điều gì đó nhưng trong mọi trường hợp, tôi nhận được một kiểu null trả về.

Tôi có thể duyệt qua cây tài liệu bằng cách sử dụng cấu trúc XML thực tế, nhưng điều này có vẻ cồng kềnh.

Đề xuất được hoan nghênh.

+0

Bạn có đang sử dụng Kiểm soát nội dung hộp kiểm không? – CoderDennis

Trả lời

10

Mã bên dưới cho biết cách liệt kê tất cả các hộp kiểm trong tài liệu từ bằng cách sử dụng phương thức Decendants<CheckBox>() trên phần nội dung của tài liệu.

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()); 
    } 
    } 
} 

Để xác định tên của một yếu tố hộp kiểm đầu vào đưa cho bạn phải truy cập vào Parent tài sản của CheckBox dụ và sau đó tìm kiếm các yếu tố FormFieldName (gán tên cho một ô trống sử dụng Properties Dialog trong Microsoft Word).

Thuộc tính DefaultCheckBoxFormFieldStateVal giữ trạng thái mặc định cho hộp kiểm. Ngoài ra thuộc tính Val của phần tử Checked giữ trạng thái đã kiểm tra thực tế của phiên bản CheckBox. Lưu ý, đối với Microsoft Word 2007 thuộc tính Val là null nếu hộp kiểm được chọn.

BEGIN EDIT

Tôi muốn mở rộng câu trả lời của tôi. Trong thực tế, có hai loại điều khiển hộp kiểm trên tab nhà phát triển MS Word - hộp kiểm kế thừa và hộp kiểm điều khiển ActiveX. Mã được hiển thị ở trên có thể được sử dụng để liệt kê các hộp kiểm kế thừa trong tài liệu từ (xem này article về cách tạo hộp kiểm kế thừa).

Theo như tôi biết, bạn không thể sử dụng SDK OpenXML để nhận/đặt giá trị cho hộp kiểm ActiveX. Tuy nhiên bạn có thể liệt kê các điều khiển ActiveX sử dụng đoạn mã sau:

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); 
} 

Để xác định có hay không một trao Control một hộp kiểm bạn phải ckeck ID lớp của Control. ID lớp của hộp kiểm là {8BD21D40-EC42-11CE-9E0D-00AA006002F3}. Đây là một mẫu mã để có được ID lớp (Tôi không biết nếu có một cách dễ dàng hơn ...):

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(); 

END EDIT

EDIT 2

Tôi không nhận ra rằng có một điều khiển hộp kiểm mới trong Word 2010 (Cảm ơn Dennis Palmer).

Để liệt kê những hộp kiểm mới kiểm soát bạn có thể sử dụng đoạn mã sau:

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"); 
    }   
    } 
} 

END EDIT 2

Hope, điều này sẽ giúp.

+0

Đó là những gì tôi dự kiến ​​sẽ làm việc, ngoại trừ ba hộp kiểm tôi đã đưa vào mã của tôi vẫn chưa được chọn. Tôi không thể cho cuộc sống của tôi tìm ra những gì tôi đã làm. Trừ khi có các loại hộp kiểm khác nhau. Tôi đã tạo một tài liệu mẫu và chèn các hộp kiểm từ nhóm Điều khiển trong tab Nhà phát triển. –

+0

@ Phil.Wheeler: Bạn có sử dụng Hộp kiểm ActiveX hoặc kiểm soát hộp kiểm kế thừa không? Lưu ý, mã ở trên chỉ hoạt động với hộp kiểm kế thừa. – Hans

+0

Tôi muốn nói đó là điều khiển ActiveX. Đó là một tài liệu hoàn toàn mới được tạo cho mục đích và hộp kiểm đã được thêm vào thông qua tab Nhà phát triển trong Word 2010. Tôi không thấy cách kiểm soát cũ sẽ xuất hiện trong phương trình. –

Các vấn đề liên quan