我目前正在帮助客户创建一个包含InfoPath的表单,并且我在使列表按照我的意愿行事时遇到了一些问题。
每当我向列表添加一个新元素(重复部分)时,它最终会出现在视图中的列表顶部,我希望它被添加到底部。我的客户想要一个自定义按钮来触发添加元素而不使用"添加元素" InfoPath提供的文本。
这是一个更好地解释我的问题的例子:
当用户在输入字段中写入某个内容时,我希望将其添加到重复部分的列表中。以下是示例代码:
private XPathNavigator GetField(string xPath)
{
return MainDataSource.CreateNavigator()
.SelectSingleNode(xPath, NamespaceManager);
}
public void CTRL10_5_Clicked(object sender, ClickedEventArgs e)
{
string xPathToList = "/my:myFields/my:group5/my:group6/my:group7";
string xPathToInput = "/my:myFields/my:group5/my:field2";
string xPathToListElement = xPathToList + "/my:field3";
//Creates a new row
XPathNavigator list = GetField(xPathToList);
XPathNavigator newRow = list.Clone();
newRow.InsertAfter(list);
//Sets values on the new row
XPathNavigator input = GetField(xPathToInput);
XPathNavigator nameField = GetField(xPathToListElement);
nameField.SetValue(input.Value);
input.SetValue("");
}
有什么建议吗?
答案 0 :(得分:0)
尝试使用
CurrentView.ExecuteAction(ActionType.XCollectionInsert, "XmlToEdit");
应该与内置的infopath“添加元素”完成相同的工作。只需将“XmlToEdit”替换为您要插入的组的名称。
答案 1 :(得分:0)
我使用它的解决方案是获取XPath表达式列表中的最后一个([last()])元素,并将元素添加到指定元素之后。
private XPathNavigator GetField(string xPath)
{
return MainDataSource.CreateNavigator()
.SelectSingleNode(xPath, NamespaceManager);
}
public void CTRL10_5_Clicked(object sender, ClickedEventArgs e)
{
string xPathToList = "/my:myFields/my:group5/my:group6/my:group7[last()]";
string xPathToInput = "/my:myFields/my:group5/my:field2";
string xPathToListElement = xPathToList + "/my:field3";
//Creates a new row
XPathNavigator list = GetField(xPathToList);
XPathNavigator newRow = list.Clone();
newRow.InsertAfter(list);
//Sets values on the new row
XPathNavigator input = GetField(xPathToInput);
XPathNavigator nameField = GetField(xPathToListElement);
nameField.SetValue(input.Value);
input.SetValue("");
}