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 DefaultCheckBoxFormFieldState
Val
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.
Bạn có đang sử dụng Kiểm soát nội dung hộp kiểm không? – CoderDennis