第一,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
第九,大功告成,运行项目看下效果