- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个可能包含多个附件的信息路径表单:通过使用一组重复元素,用户可以单击“单击添加项目”选项,他将能够上传更多附件。在 Sharepoint 中,我使用工作流来提取附件并将它们放在单独的列表中。到目前为止,我只提取了第一个,工作流程成功完成。
我可以放一个循环或其他东西来遍历表单吗?
我附上下面的代码:
public sealed partial class FileCopyFeature : SharePointSequentialWorkflowActivity
{
public FileCopyFeature()
{
InitializeComponent();
}
public Guid workflowId = default(System.Guid);
public Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties workflowProperties = new Microsoft.SharePoint.Workflow.SPWorkflowActivationProperties();
private void CopyFile(object sender, EventArgs e)
{
// Retrieve the file associated with the item
// on which the workflow has been instantiated
SPFile file = workflowProperties.Item.File;
if (file == null)
return;
// Get the binary data of the file
byte[] xmlFormData = null;
xmlFormData = file.OpenBinary();
// Load the data into an XPathDocument object
XPathDocument ipForm = null;
if (xmlFormData != null)
{
using (MemoryStream ms = new MemoryStream(xmlFormData))
{
ipForm = new XPathDocument(ms);
ms.Close();
}
}
if (ipForm == null)
return;
// Create an XPathNavigator object to navigate the XML
XPathNavigator ipFormNav = ipForm.CreateNavigator();
ipFormNav.MoveToFollowing(XPathNodeType.Element);
XmlNamespaceManager nsManager =
new XmlNamespaceManager(new NameTable());
foreach (KeyValuePair<string, string> ns
in ipFormNav.GetNamespacesInScope(XmlNamespaceScope.All))
{
if (ns.Key == String.Empty)
{
nsManager.AddNamespace("def", ns.Value);
}
else
{
nsManager.AddNamespace(ns.Key, ns.Value);
}
}
do
{
XPathNavigator nodeNav = ipFormNav.SelectSingleNode("//my:field2", nsManager);
// Retrieve the value of the attachment in the InfoPath form
//XPathNavigator nodeNav = ipFormNav.SelectSingleNode(
//"//my:field2", nsManager);
string ipFieldValue = string.Empty;
if (nodeNav != null)
{
ipFieldValue = nodeNav.Value;
// Decode the InfoPath file attachment
InfoPathAttachmentDecoder dec =
new InfoPathAttachmentDecoder(ipFieldValue);
string fileName = dec.Filename;
byte[] data = dec.DecodedAttachment;
// Add the file to a document library
using (SPWeb web = workflowProperties.Web)
{
SPFolder docLib = web.Folders["Doc"];
docLib.Files.Add(fileName, data);
docLib.Update();
// workflowProperties.Item.CopyTo(data + "/Doc/" + fileName);
}
}
}
while (ipFormNav.MoveToNext());
}
}
/// <summary>
/// Decodes a file attachment and saves it to a specified path.
/// </summary>
public class InfoPathAttachmentDecoder
{
private const int SP1Header_Size = 20;
private const int FIXED_HEADER = 16;
private int fileSize;
private int attachmentNameLength;
private string attachmentName;
private byte[] decodedAttachment;
/// <summary>
/// Accepts the Base64 encoded string
/// that is the attachment.
/// </summary>
public InfoPathAttachmentDecoder(string theBase64EncodedString)
{
byte[] theData = Convert.FromBase64String(theBase64EncodedString);
using (MemoryStream ms = new MemoryStream(theData))
{
BinaryReader theReader = new BinaryReader(ms);
DecodeAttachment(theReader);
}
}
private void DecodeAttachment(BinaryReader theReader)
{
//Position the reader to get the file size.
byte[] headerData = new byte[FIXED_HEADER];
headerData = theReader.ReadBytes(headerData.Length);
fileSize = (int)theReader.ReadUInt32();
attachmentNameLength = (int)theReader.ReadUInt32() * 2;
byte[] fileNameBytes = theReader.ReadBytes(attachmentNameLength);
//InfoPath uses UTF8 encoding.
Encoding enc = Encoding.Unicode;
attachmentName = enc.GetString(fileNameBytes, 0, attachmentNameLength - 2);
decodedAttachment = theReader.ReadBytes(fileSize);
}
public void SaveAttachment(string saveLocation)
{
string fullFileName = saveLocation;
if (!fullFileName.EndsWith(Path.DirectorySeparatorChar.ToString()))
{
fullFileName += Path.DirectorySeparatorChar;
}
fullFileName += attachmentName;
if (File.Exists(fullFileName))
File.Delete(fullFileName);
FileStream fs = new FileStream(fullFileName, FileMode.CreateNew);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(decodedAttachment);
bw.Close();
fs.Close();
}
public string Filename
{
get { return attachmentName; }
}
public byte[] DecodedAttachment
{
get { return decodedAttachment; }
}
最佳答案
看来您的问题与您对 MoveToNext
的使用有关。 Per the documentation , 此函数移动到下一个兄弟元素,并且不导航到子元素。您的代码似乎转到它找到的第一个元素(大概是 my:myFields
),寻找第一个名为 my:field2
的子元素(它只提取第一个元素,因为您正在使用 SelectSingleNode
,然后转到 my:myFields
的下一个兄弟节点(不是 my:field2
的下一个兄弟节点)。修复此问题可能是将当前的 do-while
循环替换为对 SelectNodes
的调用,如下所示,然后遍历 nodeList
。
XmlNodeList nodelist = ipFormNav.SelectNodes("//my:field2", nsManager);
关于c# - 遍历和 infoPath 形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12708302/
我将 infopath 2010 表单发布到 sharepoint 2010 表单库。我想在表单库中提供一个选项(带有按钮的 webpart)以将发布的表单导出为 PDF。有没有办法使用 Infopa
有没有办法从 InfoPath 2007 表单(可能是 manifest.xsf 文件,它们在这里不是人类可读的)以原始的、人类可读的格式自动获取规则?甚至商业工具也可以。我们希望对出现在设计表单中的
是否可以通过编程方式生成信息路径 2007 表单模板(xsn 文件=表单定义)? 我知道 infopath 2007 表单设计器没有对象模型,但是有人知道任何第三方库吗? 表单 View 本身是一个
我有一个在 InfoPath 2010 中创建的表单,作为 InfoPath 2003 兼容表单。它背后有托管代码(C#、InfoPath 2003 对象模型),并直接发布到 SharePoint 2
如何在 Infopath 2010 中将 dropdownlist 设为 Readonly 字段。 最佳答案 编辑:将解决方案 1 制作为解决方案 2,并添加一个新解决方案并将该解决方案制作为解决方案
有谁知道 SharePoint 2010 中哪里有打印信息路径表单(在我的例子中是自定义列表表单)的选项? 在 MOSS 中,此功能开箱即用,但要么我缺少一些非常简单的东西,要么我的环境设置不正确。
我有一个 InfoPath 表单模板作为 SharePoint 表单库中的内容类型。该表单有多个数据连接,在提交时,根据一个字段的填写方式将其保存回 SharePoint 上的特定表单库。 在我添加额
如何在一个简单的(定制的)表格中隐藏整行 最佳答案 在 InfoPath 中,您不能有条件地显示/隐藏(或以其他方式以编程方式影响)标准表格中的特定行/列/单元格。最好的选择是只显示/隐藏行内的字段本
作为 SharePoint 开发人员,我正在审查发布到 SharePoint Online (Office 365) 环境的支持浏览器的 InfoPath 2010 表单。 InfoPath 表单包含
当我尝试在我的订单列表上创建自定义 InfoPath 表单时,我收到以下错误: 无法使用 InfoPath 自定义 SharePoint 列表表单,因为不受支持的数据类型的字段被标记为必需,或者因为字
所以我有一个通过 sharepoint 使用 infopath 服务的表单,在多次尝试修复呈现问题(表格看起来太宽而无法阅读)之后,我想我发现了问题:日期控件。 Infopath 2007 中的日期控
表单提交到电子邮件。我想将提交日期作为变量。使用 now() 设置变量是不够的,因为在提交后再次打开表单时变量会发生变化。 最佳答案 一些可能的解决方案: Simply create a field
我们是一家全局性慈善组织。我们的 SharePoint 应用程序之一出现问题,由于无法提供解决方案,我们感到有点绝望。 问题描述:我们的 SharePoint 2010 应用程序使用 Infopath
我正在尝试将一些代码添加到 InfoPath 2013 表单中,以便在 SharePoint 2013 网站上使用。 这似乎在安装 Visual Studio 2012 并通过 InfoPath 打开
我有一个带有自定义 .NET 代码的 InfoPath 2007 表单。为了能够在我们的 Sharepoint 服务器上访问它,它需要以完全信任的方式运行(我在尝试访问我的计算机时遇到有关表单的错误,
是否可以填写信息路径表单并通过 C# 控制台应用程序提交? 如果是,那怎么办? 最佳答案 是的,您可以在 C# 应用程序中创建一个 XML 文件并将其推送到您的 Sharepoint 表单库。 Sha
我试图让一个按钮在每次单击该按钮时显示警报。目前,它仅在我第一次单击时触发,我必须刷新页面才能使其再次工作。因为这是一个提交和新建按钮,所以我需要它能够保留表单值,如果重新加载,这些值将会丢失。警报用
当您通过“关闭”功能区按钮或通过规则中的“关闭”操作关闭浏览器表单时,如果未指定源参数,则会出现“表单已关闭”页面。 在 Infopath 基于 Web 的表单中,规则优先于代码执行。同样在 UAT
我是 InfoPath 和 SharePoint 2010 的新手。我正在尝试设置 infopath 表单的权限,以便如果选中该表单中的复选框,则只有 SharePoint 中的某些用户组可以查看该表
我有一个可能包含多个附件的信息路径表单:通过使用一组重复元素,用户可以单击“单击添加项目”选项,他将能够上传更多附件。在 Sharepoint 中,我使用工作流来提取附件并将它们放在单独的列表中。
我是一名优秀的程序员,十分优秀!