How to submit the rows of a repeating table in InfoPath Form to SharePoint List – Step by Step

سلام به همه دوستان،

در این پُست به طور مختصر به توضیح در مورد فرمهای InfoPath و نحوه استفاده از فرمهای InfoPath در شیرپوینت مطالبی رو عنوان کردم. در مقاله حاضر تصمیم دارم تا با مثالی کاربردی نحوه ثبت اطلاعات جداول Repeating فرمهای InfoPath را در یک لیست شیرپوینت تشریح کنم. پس با من همراه باشید…

برای اینکار روشهای مختلفی در سایتها نوشته شده، ولی من براساس تجربیات شخصیم با یک مثال کاربردی این روش را برای شما دوستان توضیح میدم.

۱- ابتدا در سایت شیرپوینت یک لیست جدید به نام Customers ایجاد نمایید.

۲- در این لیست ۶ فیلد از نوع متنی یا متن تک خطی ایجاد نمایید. نام فیلدها به صورت زیر باشند :

FirstName, LastName, PersonalID, Tel, Email, Address

 1

۳- حال  InfoPath 2007 را باز کنید و در پنجره getting started گزینه Design a Form Template را کلیک کنید.

۴- در صفحه باز شده در قسمت Based on: بر روی Blank کلیک کنید و در پایین پنجره گزینه Enable Browser-Compatible features only را انتخاب نمایید و پنجره را با OK ببندید.

۵- در محیط برنامه از منوی سمت راست Data Source را انتخاب نمایید. بر روی myfields کلیک راست نمایید و از طریق منوی آن ۲ گروه به نامهای group1 و row ایجاد کنید. دقت کنید که گروه row از نوع Repeating باشد. بر روی row کلیک راست کنید و ۷ فیلد به نامهای زیر ایجاد نمایید.( تمام فیلدها از نوع Text باشند)

 12

۶- حال بر روی row کلیک راست کنید و گزینه Repeating Table را انتخاب کنید. این کار باعث ایجاد سطری از فیلدهای شما به صورت جدول قابل تکرار یا Repeating می شود. سپس از منوی سمت راست گزینه controls را انتخاب کنید و یک Button زیر جدول قرار دهید. (شکل های زیر)

 3

 11

۷- یک فایل txt در ویندوز بسازید و code زیر را داخل آن کپی کنید و سپس این فایل را با نام Template و با پسوند XML ذخیر نمایید. (Template.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Batch OnError="Continue">
    <Method ID="1" Cmd="New">
        <Field Name='Title'></Field>
        <Field Name="FirstName"></Field>
        <Field Name="LastName"></Field>
        <Field Name="PersonalID"></Field>
        <Field Name="Tel"></Field>
        <Field Name="Email"></Field>
        <Field Name="Address"></Field>
    </Method>
</Batch>

۸- از منوی سمت راست و قسمت Data Source یک فیلد دیگر به نام ListName در گروه myfields ایجاد کنید و از نوع text باشد. مقدار پیش فرض یا Default Value این فیلد را GUID لیستی که در مرحله ۲ در شیرپوینت ساختیم، درج کنید.

13

۹- در برنامه InfoPath از منوی Tools، گزینه Data Connections را کلیک کنید. Add را کلیک کنید. Create a new connection را انتخاب و سپس گزینه Receive Data را انتخاب نمایید.سپس Next را کلیک کنید.گزینه XML Document انتخاب شده باشد و Next را کلیک کنید. از طریق browse آدرس فایل Template.XML را انتخاب کنید و سپس دوبار Next و در انتها Finish را کلیک کنید. در پنجره Data Connections و Data Source نام Template را مشاهده خواهید کرد.

10

۱۰- در همان پنجره Data Connection مجدداً دکمه Add را کلیک کنید و سپس گزینه Submit data را از قسمت Create a new Connection انتخاب نماببد. Next و سپس گزینه To a Web Service را از پنجره بعدی انتخاب کنید و Next . در پنجره بعدی آدرس سایت و Web Service مربوط به لیست ها رو به صورت زیر وارد کنید :

 http://ServerName/_vti_bin/lists.asmx?WSDL

 5

سپس Next را کلیک کنید.در پنجره بعدی و از ستون سمت چپ UpdateListItems را انتخاب و Next را کلیک کنید.

6 

در صفحه بعدی و در قسمت Parameters گزینه اول یعنی tns:listName را انتخاب و از طریق دکمه جلوی TextBox مربوط به Field or Group ، فیلد ListName را از Data Source Main انتخاب کنید و سپس بر روی گزینه دوم یعنی tns:Updates را انتخاب و از طریق دکمه Field or group ، گروه فیلد اول Data Source با نام Template(Secondary) را انتخاب کنید. نام این گروه فیلد Batch می باشد. در قسمت Include: مقدار XML Subtree,Including selected element را برگزینید.در انتها Next و در پایان Finish را کلیک کنید. ( شکل زیر )

 7

۱۱- خُب خسته نباشید! حال زمان نوشتن کد برای ثبت اطلاعات می باشد… با من همراه باشید. 🙂

۱۲- از منوی Tools برنامه گزینه Form Options را کلیک کنید. از قسمت Category بخش Programming را انتخاب کنید. در سمت راست پنجره ، در پایین پنجره در قسمت Form template code Language زبان #C را انتخاب کنید و پنجره را با OK ببندید.

 8

۱۳- بر روی Button داخل صفحه دوبل کلیک کنید تا پنجره زیر باز شود.مقادیر فیلدها را مانند شکل زیر پر کنید.

 9

۱۴- حال بر روی دکمه Edit Form Code کلیک کنید. تا پنجره کد مربوط به Event این دکمه در Visual Studio باز شود.

۱۵- کد #C زیر را در پایین متد btnSubmit_Clicked مربوط به Event دکمه وارد کنید :

public void btnSubmit_Clicked(object sender, ClickedEventArgs e)
    {        
        XPathNavigator secDSNav = DataSources["Template"].CreateNavigator();
        XPathNodeIterator iter = secDSNav.Select("/Batch/Method");
        int methodNodesCount = iter.Count;

        XPathNavigator firstMethodNav =
        secDSNav.SelectSingleNode("/Batch/Method[1]",
        NamespaceManager);
        XPathNavigator lastMethodNav =
        secDSNav.SelectSingleNode("/Batch/Method[" + methodNodesCount.ToString() + "]",
        NamespaceManager);

        firstMethodNav.DeleteRange(lastMethodNav);
        XPathNavigator root = MainDataSource.CreateNavigator();
        XPathNodeIterator rows = root.Select(
        "/my:myFields/my:group1/my:row", NamespaceManager);
        
        int counter = 1;
        while (rows.MoveNext())
        {            
            string Title = rows.Current.SelectSingleNode(
            "my:Title", NamespaceManager).Value;
            string FirstName = rows.Current.SelectSingleNode(
            "my:FirstName", NamespaceManager).Value;
            string LastName = rows.Current.SelectSingleNode(
            "my:LastName", NamespaceManager).Value;
            string PersonalID = rows.Current.SelectSingleNode(
            "my:PersonalID", NamespaceManager).Value;
            string Tel = rows.Current.SelectSingleNode(
            "my:Tel", NamespaceManager).Value;
            string Email = rows.Current.SelectSingleNode(
            "my:Email", NamespaceManager).Value;
            string Address = rows.Current.SelectSingleNode(
            "my:Address", NamespaceManager).Value;            
            
            AddMethodNode(Title, FirstName, LastName, PersonalID, Tel, EMail, Address);            
            counter++;
        }
       
        DataConnections["WSSubmit"].Execute();

    }

    private void AddMethodNode(string f1,string f2,string f3,string f4,string f5,string f6,string f7)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        sb.AppendFormat("<Method ID=\"1\" Cmd=\"New\">");
        sb.AppendFormat("<Field Name=\"Title\">{0}</Field>", f1);
        sb.AppendFormat("<Field Name=\"FirstName\">{0}</Field>", f2);
        sb.AppendFormat("<Field Name=\"LastName\">{0}</Field>", f3);
        sb.AppendFormat("<Field Name=\"PersonalID\">{0}</Field>", f4);
        sb.AppendFormat("<Field Name=\"Tel\">{0}</Field>", f5);
        sb.AppendFormat("<Field Name=\"Email\">{0}</Field>", f6);
        sb.AppendFormat("<Field Name=\"Address\">{0}</Field>", f7);        
        sb.AppendFormat("</Method>");

        XmlDocument methodXML = new XmlDocument();
        methodXML.LoadXml(sb.ToString());

        XPathNavigator secDSNav = DataSources["Template"].CreateNavigator();
        XPathNavigator batchNav = secDSNav.SelectSingleNode("/Batch", NamespaceManager);
        batchNav.AppendChild(methodXML.DocumentElement.CreateNavigator());
    }

۱۶- حال دکمه F5 را جهت build پروژه فشار دهید. سپس پنجره VS را ببندید و پنجره Button Properties را OK نمایید.

۱۷- چون این فرم طراحی شده ما قابلیت Browser-enable را دارا می باشد. پس بهتره قبل از Publish ، آنرا از لحاظ خطاهای مختلف چک کنیم.برای اینکار از منوی سمت راست گزینه Design Checker را کلیک کنید.اگر خطا یا Error ای دریافت نکردید، مشخصه که فرم شما مشکلی جهت Publish ندارد.

۱۸- اکنون می توانید با انتخاب Preview از منوی بالایی برنامه فرم طراحی شده را تست کنید. با درج اطلاعات در هر ردیف جدول Repeating Table ، و زدن دکمه Submit کلیه اطلاعات هر ردیف به صورت یک سطر در لیست شیرپوینتی شما درج خواهد شد.

در صورت تمایل می توانید این فرم را به عنوان یک Content Type در کتابخانه فرمهای شیرپوینت Publish کنید. در مقاله بعدی نحوه Publish این فرم در شیرپوینت را تشریح خواهم کرد. همچنین به تشریح تکنیکهای حرفه ای کار با فرمهای InfoPath خواهم پرداخت.

منتظر سوالات و نظرات شما دوستانم هستم.

شاد و موفق باشید. 🙂

پاسخ دهید