Share via


연습: 콘텐츠 컨트롤을 사용자 지정 XML 부분에 바인딩

이 연습에서는 Word용 문서 수준 사용자 지정의 콘텐츠 컨트롤을 해당 문서에 저장된 XML 데이터에 바인딩하는 방법을 보여 줍니다.

적용 대상: 이 항목의 정보는 Word 2007 및 Word 2010의 문서 수준 프로젝트에 적용됩니다. 자세한 내용은 Office 응용 프로그램 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하십시오.

Word에서는 사용자 지정 XML 부분이라는 XML 데이터를 문서에 저장할 수 있습니다. 사용자 지정 XML 부분의 요소에 콘텐츠 컨트롤을 바인딩하여 이 데이터의 표시를 제어할 수 있습니다. 이 연습의 예제 문서에서는 사용자 지정 XML 부분에 저장된 직원 정보를 표시합니다. 문서를 열면 콘텐츠 컨트롤에 XML 요소의 값이 표시됩니다. 콘텐츠 컨트롤의 텍스트에 대한 모든 변경 내용은 사용자 지정 XML 부분에 저장됩니다.

이 연습에서는 다음 작업을 수행합니다.

  • 디자인 타임에 문서 수준 프로젝트의 Word 문서에 콘텐츠 컨트롤 추가

  • 콘텐츠 컨트롤에 바인딩할 요소를 정의하는 XML 데이터 파일 및 XML 스키마 만들기

  • 디자인 타임에 문서에 XML 스키마 연결

  • 런타임에 문서의 사용자 지정 XML 부분에 XML 파일 내용 추가

  • 사용자 지정 XML 부분의 요소에 콘텐츠 컨트롤 바인딩

  • XML 스키마에 정의된 값 집합에 DropDownListContentControl 바인딩

참고

다음 지침처럼 컴퓨터에서 Visual Studio 사용자 인터페이스 요소 일부에 대한 이름이나 위치를 다르게 표시할 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 Visual Studio 설정을 참조하십시오.

사전 요구 사항

이 연습을 완료하려면 다음 구성 요소가 필요합니다.

-

Microsoft Office 개발자 도구를 포함하는 Visual Studio 2010 버전입니다. 자세한 내용은 [Office 솔루션을 개발할 수 있도록 컴퓨터 구성](bb398242\(v=vs.100\).md)을 참조하십시오.
  • Microsoft Office Word 2007 또는 Word 2010

비디오에 링크 이 항목의 비디오 버전을 보려면 Video How to: Binding Content Controls to Custom XML Parts를 참조하십시오.

새 Word 문서 프로젝트 만들기

연습에서 사용할 Word 문서를 만듭니다.

새 Word 문서 프로젝트를 만들려면

  • 이름이 EmployeeControls인 Word 문서 프로젝트를 만듭니다. 새 솔루션용 문서를 만듭니다. 자세한 내용은 방법: Visual Studio에서 Office 프로젝트 만들기를 참조하십시오.

    Visual Studio의 디자이너에 새 Word 문서가 열리고 EmployeeControls 프로젝트가 솔루션 탐색기에 추가됩니다.

문서에 콘텐츠 컨트롤 추가

직원 정보를 보거나 편집할 수 있는 세 가지 유형의 콘텐츠 컨트롤이 포함된 표를 만듭니다.

문서에 콘텐츠 컨트롤을 추가하려면

  1. Visual Studio 디자이너에 호스팅된 Word 문서의 리본 메뉴에서 삽입 탭을 클릭합니다.

  2. 그룹에서 를 클릭하고 2열과 3행으로 구성된 표를 삽입합니다.

  3. 첫 번째 열에 다음 열과 같이 텍스트를 입력합니다.

    Employee Name

    Hire Date

    제목

  4. 표의 두 번째 열에서 첫 번째 행(Employee Name 옆)을 클릭합니다.

  5. 리본 메뉴에서 개발 도구 탭을 클릭합니다.

    참고

    개발 도구 탭이 표시되지 않으면 먼저 이 탭을 표시해야 합니다. 자세한 내용은 방법: 리본 메뉴에 개발 도구 탭 표시를 참조하십시오.

  6. 컨트롤 그룹에서 텍스트 단추 PlainTextContentControl를 클릭하여 첫 번째 셀에 PlainTextContentControl을 추가합니다.

  7. 표의 두 번째 열에서 두 번째 행(Hire Date 옆)을 클릭합니다.

  8. 컨트롤 그룹에서 날짜 선택 단추 DatePickerContentControl를 클릭하여 두 번째 셀에 DatePickerContentControl을 추가합니다.

  9. 표의 두 번째 열에서 세 번째 행(Title 옆)을 클릭합니다.

  10. 컨트롤 그룹에서 드롭다운 목록 단추 DropDownListContentControl를 클릭하여 마지막 셀에 DropDownListContentControl을 추가합니다.

이 프로젝트의 전체 사용자 인터페이스를 만들었습니다. 이제 프로젝트를 실행하면 첫 번째 행에 텍스트를 입력하고 두 번째 행에서 날짜를 선택할 수 있습니다. 다음 단계에서는 XML 파일을 사용하여 문서에 표시할 데이터를 연결합니다.

XML 데이터 파일 만들기

일반적으로 파일 또는 데이터베이스와 같은 외부 소스에서 XML 데이터를 가져와서 사용자 지정 XML 부분에 저장합니다. 이 연습에서는 문서의 콘텐츠 컨트롤에 바인딩할 요소로 표시된 직원 데이터가 들어 있는 XML 파일을 만듭니다. 런타임에 데이터를 사용할 수 있도록 하려면 사용자 지정 어셈블리에 XML 파일을 리소스로 포함합니다.

데이터 파일을 만들려면

  1. 프로젝트 메뉴에서 새 항목 추가를 클릭합니다.

    새 항목 추가 대화 상자가 나타납니다.

  2. 템플릿 창에서 XML 파일을 선택합니다.

  3. 파일 이름을 employees.xml로 지정하고 추가를 클릭합니다.

    코드 편집기에서 employees.xml 파일이 열립니다.

  4. employees.xml 파일의 내용을 다음 텍스트로 바꿉니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <employees xmlns="https://schemas.microsoft.com/vsto/samples">
      <employee>
        <name>Karina Leal</name>
        <hireDate>1999-04-01</hireDate>
        <title>Manager</title>
      </employee>
    </employees>
    
  5. 솔루션 탐색기에서 employees.xml을 클릭합니다.

  6. 속성 창에서 빌드 작업 속성을 선택하고 해당 값을 포함 리소스로 변경합니다.

    이 단계에서는 프로젝트를 빌드할 때 XML 파일을 어셈블리에 리소스로 포함합니다. 이렇게 하면 런타임에 XML 파일의 내용에 액세스할 수 있습니다.

XML 스키마 만들기

사용자 지정 XML 부분의 단일 요소에 콘텐츠 컨트롤을 바인딩하려는 경우 XML 스키마를 사용할 필요가 없습니다. 그러나 값 집합에 DropDownListContentControl을 바인딩하려면 이전에 만든 XLM 데이터 파일의 유효성을 검사하는 XML 스키마를 만들어야 합니다. XML 스키마에서는 title 요소에 사용할 수 있는 값을 정의합니다. 이 연습의 뒷부분에서 이 요소에 DropDownListContentControl을 바인딩합니다.

XML 스키마를 만들려면

  1. 프로젝트 메뉴에서 새 항목 추가를 클릭합니다.

    새 항목 추가 대화 상자가 나타납니다.

  2. 템플릿 창에서 XML 스키마를 선택합니다.

  3. 스키마 이름을 employees.xsd로 지정하고 추가를 클릭합니다.

    스키마 디자이너가 열립니다.

  4. 솔루션 탐색기에서 employees.xsd를 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다.

  5. employees.xsd 파일의 내용을 다음 스키마로 바꿉니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <xs:schema xmlns="https://schemas.microsoft.com/vsto/samples" 
        targetNamespace="https://schemas.microsoft.com/vsto/samples"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        elementFormDefault="qualified">
      <xs:element name="employees" type="EmployeesType"></xs:element>
      <xs:complexType name="EmployeesType">
        <xs:all>
          <xs:element name="employee" type="EmployeeType"/>
        </xs:all>
      </xs:complexType>
      <xs:complexType name="EmployeeType">
        <xs:sequence>
          <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
          <xs:element name="hireDate" type="xs:date" minOccurs="1" maxOccurs="1"/>
          <xs:element name="title" type="TitleType" minOccurs="1" maxOccurs="1"/>
        </xs:sequence>
      </xs:complexType>
      <xs:simpleType name="TitleType">
        <xs:restriction base="xs:string">
          <xs:enumeration value ="Engineer"/>
          <xs:enumeration value ="Designer"/>
          <xs:enumeration value ="Manager"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:schema>
    
  6. 파일 메뉴에서 모두 저장을 클릭하여 employees.xml 및 employees.xsd 파일의 변경 내용을 저장합니다.

문서에 XML 스키마 연결

title 요소의 유효한 값에 DropDownListContentControl을 바인딩하려면 문서에 XML 스키마를 연결해야 합니다.

문서에 XML 스키마를 연결하려면

  1. 디자이너에서 EmployeeControls.docx를 활성화합니다.

  2. 리본 메뉴에서 개발 도구 탭을 클릭합니다.

  3. XML 그룹에서 스키마를 클릭합니다.

  4. 서식 파일 및 추가 기능 대화 상자에서 XML 스키마 탭을 클릭하고 스키마 추가를 클릭합니다.

  5. 프로젝트 디렉터리에서 이전에 만든 employees.xsd 스키마를 찾은 다음 열기를 클릭합니다.

  6. 스키마 설정 대화 상자에서 확인을 클릭합니다.

  7. 확인을 클릭하여 서식 파일 및 추가 기능 대화 상자를 닫습니다.

    XML 구조 작업 창이 열립니다.

  8. XML 구조 작업 창을 닫습니다.

문서에 사용자 지정 XML 부분 추가

XML 파일의 요소에 콘텐츠 컨트롤을 바인딩하려면 먼저 문서의 새 사용자 지정 XML 부분에 XML 파일의 내용을 추가해야 합니다.

문서에 사용자 지정 XML 부분을 추가하려면

  1. 솔루션 탐색기에서 ThisDocument.cs 또는 ThisDocument.vb를 마우스 오른쪽 단추로 클릭한 다음 코드 보기를 클릭합니다.

  2. ThisDocument 클래스에 다음 선언을 추가합니다. 이 코드에서는 문서에 사용자 지정 XML 부분을 추가하는 데 사용할 몇 가지 개체를 선언합니다.

    <Cached()> _
    Public employeeXMLPartID As String = String.Empty
    Private employeeXMLPart As Office.CustomXMLPart
    Private Const prefix As String = "xmlns:ns='https://schemas.microsoft.com/vsto/samples'"
    
    [CachedAttribute()]
    public string employeeXMLPartID = string.Empty;
    private Office.CustomXMLPart employeeXMLPart;
    private const string prefix = "xmlns:ns='https://schemas.microsoft.com/vsto/samples'";
    
  3. ThisDocument 클래스에 다음 메서드를 추가합니다. 이 메서드는 어셈블리에 리소스로 포함된 XML 데이터 파일의 내용을 가져오고 해당 내용을 XML 문자열로 반환합니다.

    Private Function GetXmlFromResource() As String
        Dim asm As System.Reflection.Assembly = _
            System.Reflection.Assembly.GetExecutingAssembly()
        Dim stream1 As System.IO.Stream = asm.GetManifestResourceStream( _
                "EmployeeControls.employees.xml")
    
        Using resourceReader As System.IO.StreamReader = _
            New System.IO.StreamReader(stream1)
            If resourceReader IsNot Nothing Then
                Return resourceReader.ReadToEnd()
            End If
        End Using
    
        Return Nothing
    End Function
    
    private string GetXmlFromResource()
    {
        System.Reflection.Assembly asm =
            System.Reflection.Assembly.GetExecutingAssembly();
        System.IO.Stream stream1 = asm.GetManifestResourceStream(
            "EmployeeControls.employees.xml");
    
        using (System.IO.StreamReader resourceReader =
                new System.IO.StreamReader(stream1))
        {
            if (resourceReader != null)
            {
                return resourceReader.ReadToEnd();
            }
        }
    
        return null;
    }
    
  4. ThisDocument 클래스에 다음 메서드를 추가합니다. AddCustomXmlPart 메서드는 해당 메서드에 전달된 XML 문자열이 들어 있는 새 사용자 지정 XML 부분을 만듭니다.

    사용자 지정 XML 부분이 한 번만 만들어지도록 하기 위해 이 메서드는 일치하는 GUID가 있는 사용자 지정 XML 부분이 문서에 아직 없는 경우에만 해당 사용자 지정 XML 부분을 만듭니다. 처음 호출될 때 이 메서드는 Id 속성 값을 employeeXMLPartID 문자열에 저장합니다. employeeXMLPartID 문자열 값은 CachedAttribute 특성을 사용하여 선언되었으므로 문서에 유지됩니다.

    Private Sub AddCustomXmlPart(ByVal xmlData As String)
        If xmlData IsNot Nothing Then
    
            employeeXMLPart = Me.CustomXMLParts.SelectByID(employeeXMLPartID)
            If (employeeXMLPart Is Nothing) Then
                employeeXMLPart = Me.CustomXMLParts.Add(xmlData)
                employeeXMLPart.NamespaceManager.AddNamespace("ns", _
                    "https://schemas.microsoft.com/vsto/samples")
                employeeXMLPartID = employeeXMLPart.Id
            End If
        End If
    End Sub
    
    private void AddCustomXmlPart(string xmlData)
    {
        if (xmlData != null)
        {
            employeeXMLPart = this.CustomXMLParts.SelectByID(employeeXMLPartID);
            if (employeeXMLPart == null)
            {
                employeeXMLPart = this.CustomXMLParts.Add(xmlData, missing);
                employeeXMLPart.NamespaceManager.AddNamespace("ns", 
                    @"https://schemas.microsoft.com/vsto/samples");
                employeeXMLPartID = employeeXMLPart.Id;
            }
        }
    }
    

사용자 지정 XML 부분의 요소에 콘텐츠 컨트롤 바인딩

각 콘텐츠 컨트롤의 XMLMapping 속성을 사용하여 사용자 지정 XML 부분의 요소에 콘텐츠 컨트롤을 바인딩합니다.

사용자 지정 XML 부분의 요소에 콘텐츠 컨트롤을 바인딩하려면

  • ThisDocument 클래스에 다음 메서드를 추가합니다. 이 메서드는 각 콘텐츠 컨트롤을 사용자 지정 XML 부분의 요소에 바인딩하고 DatePickerContentControl의 날짜 표시 형식을 설정합니다.

    Private Sub BindControlsToCustomXmlPart()
        Dim xPathName As String = "ns:employees/ns:employee/ns:name"
        Me.PlainTextContentControl1.XMLMapping.SetMapping(xPathName, _
            prefix, employeeXMLPart)
    
        Dim xPathDate As String = "ns:employees/ns:employee/ns:hireDate"
        Me.DatePickerContentControl1.DateDisplayFormat = "MMMM d, yyyy"
        Me.DatePickerContentControl1.XMLMapping.SetMapping(xPathDate, _
            prefix, employeeXMLPart)
    
        Dim xPathTitle As String = "ns:employees/ns:employee/ns:title"
        Me.DropDownListContentControl1.XMLMapping.SetMapping(xPathTitle, _
            prefix, employeeXMLPart)
    End Sub
    
    private void BindControlsToCustomXmlPart()
    {
        string xPathName = "ns:employees/ns:employee/ns:name";
        this.plainTextContentControl1.XMLMapping.SetMapping(xPathName,
            prefix, employeeXMLPart);
    
        string xPathDate = "ns:employees/ns:employee/ns:hireDate";
        this.datePickerContentControl1.DateDisplayFormat = "MMMM d, yyyy";
        this.datePickerContentControl1.XMLMapping.SetMapping(xPathDate,
            prefix, employeeXMLPart);
    
        string xPathTitle = "ns:employees/ns:employee/ns:title";
        this.dropDownListContentControl1.XMLMapping.SetMapping(xPathTitle,
            prefix, employeeXMLPart);
    }
    

문서가 열릴 때 코드 실행

문서가 열릴 때 사용자 지정 XML 부분을 만들고 사용자 지정 컨트롤을 데이터에 바인딩합니다.

문서가 열릴 때 코드를 실행하려면

  • 다음 코드를 ThisDocument 클래스의 ThisDocument_Startup 메서드에 추가합니다. 이 코드는 employees.xml 파일에서 XML 문자열을 가져오고, 문서의 새 사용자 지정 XML 부분에 XML 문자열을 추가하고, 사용자 지정 XML 부분의 요소에 콘텐츠 컨트롤을 바인딩합니다.

    Dim xmlData As String = GetXmlFromResource()
    If xmlData IsNot Nothing Then
        AddCustomXmlPart(xmlData)
        BindControlsToCustomXmlPart()
    End If
    
    string xmlData = GetXmlFromResource();
    
    if (xmlData != null)
    {
        AddCustomXmlPart(xmlData);
        BindControlsToCustomXmlPart();
    }
    

프로젝트 테스트

문서를 열면 사용자 지정 XML 부분의 요소에 있는 데이터가 콘텐츠 컨트롤에 표시됩니다. DropDownListContentControl을 클릭하여 employees.xsd 파일에 정의된 title 요소의 유효한 값 세 개 중 하나를 선택할 수 있습니다. 콘텐츠 컨트롤에서 데이터를 편집하면 새 값은 문서의 사용자 지정 XML 부분에 저장됩니다.

콘텐츠 컨트롤을 테스트하려면

  1. F5 키를 눌러 프로젝트를 실행합니다.

  2. 문서의 표가 다음 표와 같은지 확인합니다. 두 번째 열의 각 문자열은 문서의 사용자 지정 XML 부분에 있는 요소에서 가져옵니다.

    Employee Name

    Karina Leal

    Hire Date

    April 1, 1999

    제목

    관리자

  3. Employee Name 셀의 오른쪽에 있는 셀을 클릭하고 다른 이름을 입력합니다.

  4. Hire Date 셀의 오른쪽에 있는 셀을 클릭하고 날짜 선택기에서 다른 날짜를 선택합니다.

  5. Title 셀의 오른쪽에 있는 셀을 클릭하고 드롭다운 목록에서 새 항목을 선택합니다.

  6. 문서를 저장하고 닫습니다.

  7. Windows 탐색기에서 프로젝트가 저장된 위치의 \bin\Debug 폴더를 엽니다.

  8. EmployeeControls.docx를 마우스 오른쪽 단추로 클릭한 다음 이름 바꾸기를 클릭합니다.

  9. 파일 이름을 EmployeeControls.docx.zip으로 지정합니다.

    EmployeeControls.docx 문서가 Open XML 형식으로 저장됩니다. 이 문서의 이름을 .zip 파일 확장명으로 바꿔 문서의 내용을 검사할 수 있습니다. Open XML에 대한 자세한 내용은 기술 문서 Introducing the Office (2007) Open XML File Formats를 참조하십시오.

  10. EmployeeControls.docx.zip 파일을 두 번 클릭합니다.

  11. customXml 폴더를 두 번 클릭합니다.

  12. item2.xml을 마우스 오른쪽 단추로 클릭하고 열기를 클릭합니다.

    이 파일에는 문서에 추가한 사용자 지정 XML 부분이 들어 있습니다.

  13. name, hireDate 및 title 요소에 문서의 콘텐츠 컨트롤에 입력한 새 값이 들어 있는지 확인합니다.

  14. item2.xml 파일을 닫습니다.

다음 단계

다음 항목에서는 콘텐츠 컨트롤을 사용하는 방법에 대해 더 자세히 설명합니다.

참고 항목

작업

방법: Word 문서에 콘텐츠 컨트롤 추가

방법: 콘텐츠 컨트롤을 사용하여 문서 부분 보호

개념

확장된 개체를 사용하여 Word 자동화

콘텐츠 컨트롤

호스트 항목 및 호스트 컨트롤 개요

호스트 항목 및 호스트 컨트롤의 프로그래밍에 대한 제한 사항

런타임에 Office 문서에 컨트롤 추가

호스트 컨트롤의 도우미 메서드