예제 샌드박스 솔루션

관리 코드가 포함된 InfoPath 2010 양식을 InfoPath 2010 Designer에서 SharePoint 샌드박스 솔루션 인프라로 게시할 수 있습니다. 이 항목에서는 InfoPath 샌드박스 솔루션에서 작성할 수 있는 코드 유형을 보여 주는 두 가지 예와 양식 서식 파일을 게시하는 방법을 제공합니다.

예 1: 주문 양식에서 데이터 정렬

InfoPath 양식에서 코드를 사용하여 수행할 수 있는 유용한 작업은 반복 표의 데이터를 정렬하는 것입니다. 이 작업을 수행하기 위해 코드에서는 InfoPath 양식에 표시되는 원본으로 사용하는 XML 문서의 노드 순서를 바꿉니다. 이 항목에서 설명된 시나리오는 InfoPath에서 샌드박스 솔루션으로 직접 게시하는 데 목적이 있지만 관리자가 승인한 양식 서식 파일로 배포할 수도 있습니다.

시작하기 전에 다음 요구 사항을 충족하는지 확인합니다.

  • 양식을 게시하려는 SharePoint Server 2010 또는 SharePoint Foundation 2010 사이트의 사이트 모음 관리자입니다.

  • 양식 서식 파일에 대해 선택한 프로그래밍 언어가 이전 버전 이름이 뒤에 붙지 않는 C# 또는 Visual Basic입니다. InfoPath 2007 호환 및 InfoPath 2003 호환 버전의 프로그래밍 언어와 개체 모델은 샌드박스 솔루션에 대해 지원되지 않습니다. 프로그래밍 언어를 지정하는 방법에 대한 자세한 내용은 방법: Visual Studio Tools for Applications 설치 및 이를 사용한 개발을 참조하십시오.

다음 단계를 수행하여 양식의 반복 표 컨트롤에서 데이터를 정렬하는 양식 서식 파일을 만듭니다.

양식의 데이터를 프로그래밍 방식으로 정렬하는 양식 서식 파일을 만들려면

  1. InfoPath Designer에서 새 양식 서식 파일을 만들고 반복 표 컨트롤을 양식에 추가합니다. 이 예의 예제 코드는 표의 첫 번째 열을 기준으로 행을 정렬하지만, 다른 열을 기준으로 정렬하도록 코드를 쉽게 수정할 수 있습니다.

  2. 단추 컨트롤을 양식에 추가합니다. 표를 정렬하는 코드가 단추의 Clicked 이벤트에 대한 이벤트 처리기에 추가되지만 이 용도로 다른 이벤트를 사용할 수도 있습니다.

  3. 단추를 선택하고 속성 탭을 클릭한 다음 사용자 지정 코드를 클릭합니다. 양식을 아직 저장하지 않은 경우 저장하라는 메시지가 나타난 후 단추의 이벤트 처리기에 커서가 놓인 상태로 코드 편집기가 열립니다.

  4. 다음 코드를 단추의 이벤트 처리기에 붙여넣습니다. 이 코드는 첫 번째 열의 요소를 배열에 넣고 이 배열을 정렬한 다음 정렬된 배열을 기준으로 표의 순서를 바꿉니다. 이 코드에서는 정렬되는 데이터가 문자열 데이터라고 가정합니다.

    // Put the elements from the first column into an array.
    XPathNavigator root = this.CreateNavigator();
    
    // Create a node iterator which contains only the values that you want to sort.
    // For this form, the entire table is in "group1", each row is a "group2"
    // and the rows are "field1", "field2" and "field3" respectively.
    XPathNodeIterator nodeIterator = root.Select(
        "/my:myFields/my:group1/my:group2/my:field1", this.NamespaceManager);
    
    // Create arrays to use for sorting.
    string[] sortArrayWords = new string[nodeIterator.Count + 1];
    int[] sortArrayKeys = new int[nodeIterator.Count + 1];
    int arrayPosition = 1;
    
    // Populate the arrays for sorting.
    while (nodeIterator.MoveNext()) 
    {
        // Loop until there are no more elements
        sortArrayWords[arrayPosition] = nodeIterator.Current.Value;
        sortArrayKeys[arrayPosition] = arrayPosition;
        arrayPosition += 1;
    }
    
    // Sort the array.
    Array.Sort(sortArrayWords, sortArrayKeys);
    arrayPosition = 0;
    
    // Create new XML to update the table.
    string newTableXML = "";
    // Iterate through the sorted array of keys.
    for (int i = 1; i <= sortArrayWords.Length - 1; i++) 
    {
        nodeIterator = root.Select(
            "/my:myFields/my:group1/my:group2", this.NamespaceManager);
    
        // Go to the right position in the table.
        for (int j = 1; j <= sortArrayKeys[i]; j++) 
        {
            nodeIterator.MoveNext();
        }
    
        // Add the row to the XML.
        newTableXML += nodeIterator.Current.OuterXml;
    }
    
    // Set the table to use the new XML.
    root.SelectSingleNode(
        "/my:myFields/my:group1", this.NamespaceManager).InnerXml = newTableXML;
    
    ' Put the elements from the first column into an array.
    Dim root As XPathNavigator = Me.CreateNavigator
    
    ' Create a node iterator which contains only the values that you want to sort
    ' For this form, the entire table is in "group1",
    ' each row is a "group2"
    ' and the rows are "field1", "field2" and "field3" respectively.
    Dim nodeIterator As XPathNodeIterator = root.Select( _
        "/my:myFields/my:group1/my:group2/my:field1", Me.NamespaceManager)
    
    ' Create arrays to use for sorting.
    Dim sortArrayWords(nodeIterator.Count) As String
    Dim sortArrayKeys(nodeIterator.Count) As Integer
    Dim arrayPosition As Integer = 1
    
    ' Populate the arrays for sorting.
    While nodeIterator.MoveNext() ' Loop until there are no more elements
       sortArrayWords(arrayPosition) = nodeIterator.Current.Value
       sortArrayKeys(arrayPosition) = arrayPosition
       arrayPosition += 1
    End While
    
    ' Sort the array.
    Array.Sort(sortArrayWords, sortArrayKeys)
    arrayPosition = 0
    
    ' Create new XML to update the table.
    Dim newTableXML As String = ""
    ' Iterate through the sorted array of keys.
    For i As Integer = 1 To sortArrayWords.Length - 1
       nodeIterator = root.Select( _
          "/my:myFields/my:group1/my:group2", Me.NamespaceManager)
    
       ' Go to the right position in the table.
       For j As Integer = 1 To sortArrayKeys(i)
         nodeIterator.MoveNext()
       Next
    
    ' Add the row to the XML.
    newTableXML &= nodeIterator.Current.OuterXml
    Next
    
    ' Set the table to use the new XML.
    root.SelectSingleNode("/my:myFields/my:group1", _
        Me.NamespaceManager).InnerXml = newTableXML
    
  5. 다음 단계를 수행하여 양식을 게시합니다.

    1. Backstage의 게시 탭에서 SharePoint Server를 클릭합니다.

    2. 게시할 SharePoint 사이트의 URL을 입력하고 다음을 클릭합니다.

      중요

      이 양식 서식 파일을 샌드박스 솔루션으로 게시하려면 이 사이트의 사이트 모음 관리자여야 합니다.

    3. 양식 라이브러리를 선택하고 다음을 클릭합니다.

    4. 새 양식 라이브러리 만들기를 선택하고 다음을 클릭합니다.

    5. 양식 라이브러리의 이름과 설명을 입력하고 다음을 클릭합니다.

    6. 게시를 클릭합니다.

예 2: SharePoint 목록에서 공급업체 관리

이 예에는 Microsoft SharePoint Foundation 2010 개체 모델에 대한 프로그래밍 작업이 포함됩니다. 이 작업을 수행하려면 SharePoint Server 2010 정품과 함께 설치되는 Microsoft.SharePoint.dll 어셈블리에 대한 참조를 설정해야 합니다.

Microsoft.SharePoint.Server.dll은 기본적으로 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\ISAPI에 설치됩니다. 이 DLL은 SharePoint 개체 모델에 대해 프로그래밍할 프로젝트에 포함되어야 합니다. Microsoft Visual Studio Tools for Applications 프로젝트에서 Microsoft.SharePoint.dll에 대한 참조를 설정하려면 코드 편집기를 열고 도구 메뉴에서 참조 추가를 클릭합니다. 참조 추가 대화 상자에서 찾아보기 탭을 클릭하고 Microsoft.SharePoint.dll 파일의 위치를 지정한 다음 확인을 클릭합니다. 그러면 Microsoft.SharePoint.dll이 프로젝트 디렉터리에 복사되어 InfoPath 솔루션에서 SharePoint Foundation 2010 개체 모델 멤버를 사용할 수 있습니다.

양식 디자인 및 코드 개발

InfoPath 양식의 코드에서 SharePoint 개체 모델을 사용하여 조회 목록에 항목을 만들 수 있습니다. 이 작업은 SharePoint 목록을 사용하여 드롭다운 상자를 채우고 별도의 양식을 만들지 않고 드롭다운 상자에 값을 추가하려는 경우에 유용합니다. 이 예에서는 콤보 상자를 사용하여 현재 목록에 있는 모든 값을 표시하고 목록에 값이 없을 경우 프로그래밍 논리를 만들어 해당 값을 목록에 추가합니다.

SharePoint 목록을 기반으로 콤보 상자에 새 항목을 추가할 수 있는 양식 서식 파일을 만들려면

  1. 콤보 상자 컨트롤을 양식에 삽입하고 콤보 상자에 바인딩된 필드의 이름을 myCombo로 바꿉니다.

  2. 다음 단계를 수행하여 콤보 상자를 채우는 데 사용할 목록에 대한 데이터 연결을 만듭니다.

    1. 데이터 탭의 외부 데이터 가져오기 그룹에서 SharePoint 목록 사용 단추를 클릭합니다.

    2. 목록이 들어 있는 사이트의 URL을 입력하고 다음을 클릭합니다.

    3. 목록을 선택하고 다음을 클릭합니다.

    4. 이 예에서 포함할 필드를 선택하고 Title 및 ID를 선택합니다. Title에는 조회할 값이 포함됩니다. 다음을 클릭합니다.

    5. 다음 화면에서 다음을 클릭합니다.

    6. 데이터 연결의 이름을 LookupList로 지정하고 마침을 클릭합니다.

  3. 다음 단계를 수행하여 목록을 기반으로 콤보 상자에 값을 채웁니다.

    1. 1단계에서 만든 콤보 상자를 선택합니다.

    2. 리본의 컨트롤 도구 속성 탭에서 선택 사항 편집을 클릭합니다.

    3. 외부 데이터 원본에서 선택 사항 가져오기를 선택합니다.

    4. 데이터 원본이 2단계에서 만든 데이터 연결로 설정되었는지 확인합니다.

    5. 값과 표시 이름을 Title로 설정합니다.

  4. 단추 컨트롤을 양식에 추가합니다. 사용자가 단추를 클릭하면 코드가 실행됩니다. 프로덕션 양식에서 전송 시 또는 콤보 상자의 값이 변경될 때 이 논리가 실행되도록 할 수 있습니다. 코드가 양식에서 어떠한 작업도 수행하지 않는 경우 불필요한 포스트백 작업을 피하기 위해 전송 시 이 논리를 실행하는 것이 좋습니다.

  5. 단추를 선택합니다. 리본의 컨트롤 도구 속성 탭에서 사용자 지정 코드를 클릭합니다. 양식을 아직 저장하지 않은 경우 양식을 저장하라는 메시지가 표시됩니다.

  6. 이 항목의 앞부분에서 설명한 대로 Microsoft.SharePoint.dll 어셈블리에 대한 참조를 추가합니다.

  7. 다음은 코드의 형태를 보여 주는 간단한 예입니다. 코드는 먼저 콤보 상자의 값이 목록에 있는지 확인한 다음 필요한 경우 새 항목을 만듭니다. 코드에서 사용하는 SharePoint 개체 모델 멤버 중에 삭제 가능한 멤버를 모두 삭제해야 합니다. 그렇지 않으면 코드에서 예외가 발생합니다.

    // Get the value of the combo box
    XPathNavigator root = this.CreateNavigator();
    string theComboVal = root.SelectSingleNode("/my:myFields/my:myCombo", this.NamespaceManager).Value;
    
    // Get the list
    SPSite mySite = new SPSite("http:// YourServer/YourSite/");
    SPWeb myWeb = mySite.RootWeb;
    SPList myList = myweb.Lists("LookupList");
    
    // Query the list to see if it contains the item
    SPQuery myQuery = new SPQuery();
    myQuery.Query = "<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + theComboVal + "</Value></Eq></Where>";
    SPListItemCollection myListItemCollection = myList.GetItems(myQuery);
    
    // If the query returns no items, create one
    if (myListItemCollection.Count == 0) 
    {
        SPListItemCollection listItems = myList.Items;
        SPListItem newItem = listItems.Add();
        newItem("Title") = theComboVal;
        newItem.Update();
    }
    
    // Dispose of SharePoint items
    myWeb.Dispose();
    mySite.Dispose();
    
    ' Get the value of the combo box
    Dim root As XPathNavigator = Me.CreateNavigator
    Dim theComboVal As String = root.SelectSingleNode("/my:myFields/my:myCombo",   Me.NamespaceManager).Value
    
    ' Get the list
    Dim mySite As SPSite = New SPSite("http:// YourServer/YourSite/")
    Dim myWeb As SPWeb = mySite.RootWeb
    Dim myList As SPList = myweb.Lists("LookupList")
    
    ' Query the list to see if it contains the item
    Dim myQuery As New SPQuery()
    myQuery.Query = "<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + theComboVal + "</Value></Eq></Where>"
    Dim myListItemCollection As SPListItemCollection = myList.GetItems(myQuery)
    
    ' If the query returns no items, create one
    If myListItemCollection.Count = 0 Then
        Dim listItems As SPListItemCollection = myList.Items
        Dim newItem As SPListItem = listItems.Add()
        newItem("Title") = theComboVal
        newItem.Update()
    End If
    
    ' Dispose of SharePoint items
    myWeb.Dispose()
    mySite.Dispose()
    
  8. 다음 단계를 수행하여 양식을 게시합니다.

    1. Backstage의 게시 탭에서 SharePoint Server를 클릭합니다.

    2. 게시할 SharePoint 사이트의 URL을 입력하고 다음을 클릭합니다.

      중요

      이 양식 서식 파일을 샌드박스 솔루션으로 게시하려면 이 사이트의 사이트 모음 관리자여야 합니다.

    3. 양식 라이브러리를 선택하고 다음을 클릭합니다.

    4. 새 양식 라이브러리 만들기를 선택하고 다음을 클릭합니다.

    5. 양식 라이브러리의 이름과 설명을 입력하고 다음을 클릭합니다.

    6. 게시를 클릭합니다.