第一,vs中新建winform项目。

第二,在winform项目中添加引用

     

第三,添加一个用户控件

       

代码
#region Component Designer generated code

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.labelInfoPathNotInstalled = new System.Windows.Forms.Label();
this.labelNoDocumentAvailable = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// labelInfoPathNotInstalled
//
this.labelInfoPathNotInstalled.Anchor = System.Windows.Forms.AnchorStyles.None;
this.labelInfoPathNotInstalled.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelInfoPathNotInstalled.Location = new System.Drawing.Point(223, 175);
this.labelInfoPathNotInstalled.Name = "labelInfoPathNotInstalled";
this.labelInfoPathNotInstalled.Size = new System.Drawing.Size(192, 86);
this.labelInfoPathNotInstalled.TabIndex = 0;
this.labelInfoPathNotInstalled.Text = "Unfortunately InfoPath seems to be not installed on this computer.";
this.labelInfoPathNotInstalled.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.labelInfoPathNotInstalled.Visible = false;
//
// labelNoDocumentAvailable
//
this.labelNoDocumentAvailable.Anchor = System.Windows.Forms.AnchorStyles.None;
this.labelNoDocumentAvailable.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelNoDocumentAvailable.Location = new System.Drawing.Point(223, 175);
this.labelNoDocumentAvailable.Name = "labelNoDocumentAvailable";
this.labelNoDocumentAvailable.Size = new System.Drawing.Size(192, 86);
this.labelNoDocumentAvailable.TabIndex = 2;
this.labelNoDocumentAvailable.Text = "No document is available.";
this.labelNoDocumentAvailable.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.labelNoDocumentAvailable.Click += new System.EventHandler(this.labelNoDocumentAvailable_Click);
//
// InfoPathUserControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Controls.Add(this.labelNoDocumentAvailable);
this.Controls.Add(this.labelInfoPathNotInstalled);
this.Name = "InfoPathUserControl";
this.Size = new System.Drawing.Size(638, 436);
this.Load += new System.EventHandler(this.InfoPathUserControl_Load);
this.ResumeLayout(false);

}

#endregion

 

 

       

第四,为用户控件添加事件

        

代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.InfoPath;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Xml.XPath;
using System.Security.Permissions;
using System.Globalization;
using System.Runtime.InteropServices;

namespace FJGISDraw
{
public enum UIStatesForm
{
NoDocumentAvailable,
DocumentReadMode,
DocumentEditMode
};

[EnvironmentPermissionAttribute(
SecurityAction.InheritanceDemand)]
public partial class InfoPathUserControl : UserControl
{
const string READONLY_VIEW_NAME = "readonly";

InfoPathInitEventHandler infoPathInitEventHandler;

private bool readOnly;
internal bool ReadOnly
{
private set { readOnly = value; }
get { return readOnly; }
}

public bool InfoPathInstalled { get; private set; }

public bool IsInitialized { get; set; }

private Microsoft.Office.InfoPath.FormControl formControl;

public InfoPathUserControl()
{
InitializeComponent();
}


#region Initialize InfoPath

public void InitInfoPathForm()
{
if (this.IsInitialized) return;

// Write asynchron
this.InitInfoPath();
}

[System.Diagnostics.CodeAnalysis.SuppressMessage(
"Microsoft.Design",
"CA1031",
Justification
="False initialization does not depend on exception type")]
void InitInfoPath()
{
// Init form component
System.ComponentModel.ComponentResourceManager resources =
new System.ComponentModel.ComponentResourceManager(
typeof(InfoPathUserControl));

try
{
InitInfoPathControlUI(resources);

this.labelInfoPathNotInstalled.Visible = false;
this.InfoPathInstalled = true;

InitInfoPathInitEventhandler();
}
catch (Exception)
{
this.InfoPathInstalled = false;

this.labelInfoPathNotInstalled.Visible = true;
}
finally
{
this.labelNoDocumentAvailable.Visible = false;

this.IsInitialized = true;

// update again after init (only this view is needed)
this.RefreshView(
UIStatesForm.NoDocumentAvailable);
}
}

private void InitInfoPathControlUI(System.ComponentModel.ComponentResourceManager resources)
{
this.formControl =
new Microsoft.Office.InfoPath.FormControl();
((System.ComponentModel.ISupportInitialize)
(
this.formControl)).BeginInit();

this.formControl.Visible = false;
this.formControl.Dock = DockStyle.Fill;
this.formControl.Enabled = true;
this.formControl.Location =
new System.Drawing.Point(0, 0);
this.formControl.Name = "formControl1";
this.formControl.OcxState =
((System.Windows.Forms.AxHost.State)
(resources.GetObject(
"formControl1.OcxState")));
this.formControl.Size =
new System.Drawing.Size(
this.Width,
this.Height);
this.formControl.TabIndex = 0;

this.Controls.Add(this.formControl);
((System.ComponentModel.ISupportInitialize)
(
this.formControl)).EndInit();
}

private void InitInfoPathInitEventhandler()
{
this.infoPathInitEventHandler =
InfoPathInitEventHandler.CreateInstance(
this.formControl);

this.formControl.SetInitEventHandler(
this.infoPathInitEventHandler);
}

private void TestInitialization()
{
if (!this.IsInitialized) throw new InvalidOperationException("Object is not initialized");
if (!this.InfoPathInstalled) throw new InvalidOperationException("InfoPath is not installed on this computer");
}

#endregion


#region InfoPath loading / creating / handling

[EnvironmentPermissionAttribute(
SecurityAction.LinkDemand)]
public void CreateFormTemplate(Uri formUrlName)
{
TestInitialization();

this.CreateFormTemplate(
formUrlName,
null);
}

[EnvironmentPermissionAttribute(
SecurityAction.LinkDemand)]
public void CreateFormTemplate(
Uri formUrlName,
Stream dataStream)
{
TestInitialization();

try
{
this.formControl.Close();

// Open / create a form
if (dataStream != null)
formControl.NewFromFormTemplate(
formUrlName.ToString(),
dataStream,
XmlFormOpenMode.Default);
else
formControl.NewFromFormTemplate(
formUrlName.ToString());

// Default view of InfoPath document could be the
// readonly or another one
this.InitReadOnlyFlag();

RefreshView(UIStatesForm.DocumentReadMode);
}
catch (Exception)
{
RefreshView(UIStatesForm.NoDocumentAvailable);

throw;
}
}

[EnvironmentPermissionAttribute(
SecurityAction.LinkDemand)]
public void CloseFormTemplate()
{
formControl.Close();

RefreshView(UIStatesForm.NoDocumentAvailable);
}

[EnvironmentPermissionAttribute(
SecurityAction.LinkDemand,
Unrestricted
= true)]
public void SetFieldValue(string fieldName, string fieldValue)
{
TestInitialization();

var navigator
=
formControl.XmlForm.MainDataSource.CreateNavigator();

string namespaceName;
bool foundNamespace;
FindInfoPathNamespace(
navigator,
out namespaceName,
out foundNamespace);

var nav2
= navigator.Clone();
var found
= nav2.MoveToFollowing(
fieldName,
namespaceName);
if (found)
nav2.SetValue(fieldValue);
}

[EnvironmentPermissionAttribute(
SecurityAction.LinkDemand)]
public void SwitchView()
{
TestInitialization();

try
{
ViewInfo readOnlyView
= null;
ViewInfo editView
= null;
foreach (ViewInfo view in this.formControl.XmlForm.ViewInfos)
{
if (string.Compare(view.Name.ToLower(
CultureInfo.CurrentCulture),
READONLY_VIEW_NAME,
StringComparison.CurrentCulture)
== 0)
readOnlyView
= view;
else editView = view;
}

var new_readonly
= !this.readOnly;

if (new_readonly)
this.formControl.XmlForm.ViewInfos.SwitchView(readOnlyView);
else this.formControl.XmlForm.ViewInfos.SwitchView(editView);

// Switching view was successful
this.readOnly = new_readonly;
}
catch (COMException)
{
// switching view was not successfull, do nothing
}
}

#endregion


#region Validate and save InfoPath document

[EnvironmentPermissionAttribute(
SecurityAction.LinkDemand)]
public int ValidateInfoPath()
{
TestInitialization();

return this.formControl.XmlForm.Errors.Count;
}

public string FormData
{
[EnvironmentPermissionAttribute(
SecurityAction.LinkDemand)]
get
{
TestInitialization();

XmlForm xf
= formControl.XmlForm;
if (xf != null) return xf.MainDataSource.
CreateNavigator().OuterXml;
else return string.Empty;
}
}

#endregion


#region Private help methods

private static void FindInfoPathNamespace(
System.Xml.XPath.XPathNavigator navigator2,
out string namespaceName2,
out bool foundNamespace2)
{
namespaceName2
= string.Empty;
foundNamespace2
= false;
if (navigator2.MoveToFirstChild())
{
namespaceName2
= navigator2.LookupNamespace(@"xmlns:my");
while (namespaceName2 == null || namespaceName2.Length <= 0)
{
if (!navigator2.MoveToNext())
break;
namespaceName2
= navigator2.LookupNamespace(@"my");
};
}
if (namespaceName2 != null && namespaceName2.Length > 0)
foundNamespace2
= true;
}

private void RefreshView(UIStatesForm currentUIStatesForms)
{
if (this.InfoPathInstalled)
{
switch (currentUIStatesForms)
{
case UIStatesForm.NoDocumentAvailable:
this.Enabled = false;
if (this.formControl != null)
{
this.formControl.Visible = false;
}
this.labelInfoPathNotInstalled.Visible = false;
this.labelNoDocumentAvailable.Visible = true;
break;
case UIStatesForm.DocumentReadMode:
case UIStatesForm.DocumentEditMode:
this.Enabled = true;
if (this.formControl != null)
{
this.formControl.Visible = true;
}
this.labelInfoPathNotInstalled.Visible = false;
this.labelNoDocumentAvailable.Visible = false;
break;
}
}
else
{
this.labelInfoPathNotInstalled.Visible = true;
}
}

internal void InitReadOnlyFlag()
{
if (this.IsInitialReadOnly == true)
this.ReadOnly = true;
else this.ReadOnly = false;
}

private bool IsInitialReadOnly
{
get
{
return
(
string.Compare(this.formControl.
XmlForm.ViewInfos.Default.Name,
READONLY_VIEW_NAME,
true,
CultureInfo.CurrentCulture)
== 0);
}
}

#endregion

private void InfoPathUserControl_Load(object sender, EventArgs e)
{

}

private void labelNoDocumentAvailable_Click(object sender, EventArgs e)
{

}
}
}

 

 


第五,为用户控件添加注册事件

        

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office.InfoPath;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Xml.XPath;
using System.Security.Permissions;
using System.Globalization;
using System.Runtime.InteropServices;

namespace FJGISDraw
{
public partial class InfoPathUserControl : UserControl
{
    #region class InfoPathInitEventHandler 

    internal class InfoPathInitEventHandler : IInitEventHandler
    {
        private InfoPathInitEventHandler() { }

        FormControl formControl;
        bool internalStartupDeclared;

        private InfoPathInitEventHandler(
            FormControl formControl)
        {
            this.formControl = formControl;
        }

        internal static InfoPathInitEventHandler CreateInstance(
            FormControl formControl)
        {
            return new InfoPathInitEventHandler(
                        formControl);
        }


        #region IInitEventHandler Members

        public void InitEventHandler(
            object sender,
            XmlForm xmlForm,
            out Microsoft.Office.Interop.InfoPath.XdReadOnlyViewMode
                viewsReadOnlyMode)
        {
            viewsReadOnlyMode =
                Microsoft.Office.Interop.InfoPath.XdReadOnlyViewMode.xdDefault;

            if (!internalStartupDeclared)
            {
                this.formControl.InternalStartup +=
                    new FormControl.EventHandler<EventArgs>(formControl_InternalStartup);
                internalStartupDeclared = true;
            }
        }

        void formControl_InternalStartup(object sender, EventArgs e)
        {
            this.formControl.EventManager.FormEvents.ContextChanged +=
                new ContextChangedEventHandler(FormEvents_ContextChanged);
            this.formControl.EventManager.FormEvents.ViewSwitched +=
                new ViewSwitchedEventHandler(FormEvents_ViewSwitched);
        }

        #endregion

        void FormEvents_ViewSwitched(object sender, ViewSwitchedEventArgs e)
        {
        }

        void FormEvents_ContextChanged(
            object sender,
            ContextChangedEventArgs e)
        {
        }
    }

    #endregion
}
}


第六,运行项目用户控件制作完成

       

第七,新建winform页面 并将这个用户控件拖入窗体上,合适的调整大小

       

第八,为窗体写入后台代码,加载infopath模板与xml数据文件(我的项目中模板在本地文件夹,xml数据从数据库读取)

        

public FrmEquipForm()
        {
            InitializeComponent();
            this.infoPathUserControl1.InitInfoPathForm();
        }
        Stream sr = null;
        private void FrmEquipForm_Load(object sender, EventArgs e)
        {
            //得到数据流
           
        }
        public Stream FileToStream(string fileName)
        {
            // 打开文件 
            FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
            // 读取文件的 byte[] 
            byte[] bytes = new byte[fileStream.Length];
            fileStream.Read(bytes, 0, bytes.Length);
            fileStream.Close();
            // 把 byte[] 转换成 Stream 
            Stream stream = new MemoryStream(bytes);
            return stream;
        }
        static private void RefreshSwitchViewName(
           InfoPathUserControl InfoPathUserCtrl,
           Button buttonSwitchView)
        {
            buttonSwitchView.Text =
                "Switch view (Readonly is " +
                InfoPathUserCtrl.ReadOnly +
                ")";
        }

        static private void CreateDocument(
            InfoPathUserControl InfoPathUserCtrl,
            Stream info,
            Button buttonSetFieldValue,
            Button buttonSwitchView,
            string InfoPathTemplate)
        {
            InfoPathUserCtrl.CreateFormTemplate(
                new Uri(
                    Path.Combine(
                        System.Environment.CurrentDirectory,
                        InfoPathTemplate)),info);

            buttonSetFieldValue.Enabled = true;
            buttonSwitchView.Enabled = true;
            RefreshSwitchViewName(
                InfoPathUserCtrl,
                buttonSwitchView);
        }

        static private void SetFieldValue(InfoPathUserControl InfoPathUserControl)
        {
            InfoPathUserControl.SetFieldValue(
                "name", System.Environment.UserName);
        }

        static private void SwitchView(
            InfoPathUserControl InfoPathUserCtrl,
            Button buttonSwitchView)
        {
            InfoPathUserCtrl.SwitchView();
            RefreshSwitchViewName(
                InfoPathUserCtrl,
                buttonSwitchView);
        }

        #region Event handlers for 1st document instance + buttons

        private void buttonCreateDocument_Click(
            object sender, EventArgs e)
        {
            //sr = new FileStream(@"462.xml");
            sr = FileToStream(@"462.xml");
            CreateDocument(
                this.infoPathUserControl1,sr,
                this.buttonSetFieldValue,
                this.buttonSwitchView,
                @"diangan.xsn");
        }

        private void buttonSetFieldValue_Click(
            object sender, EventArgs e)
        {
            SetFieldValue(infoPathUserControl1);
        }

        private void buttonSwitchView_Click(
            object sender, EventArgs e)
        {
            SwitchView(
                this.infoPathUserControl1,
                this.buttonSwitchView);
        }

        #endregion


第九,大功告成,运行项目看下效果