InfoPath 以编程方式将新行添加到列表末尾
InfoPath adding a new row programmatically to end of list
我目前正在帮助客户使用 InfoPath 创建表单,但我在让列表按我想要的方式运行时遇到了一些问题。
每当我将新元素添加到列表(重复部分)时,它最终会出现在视图中列表的顶部,我希望它被添加到底部。我的客户想要一个自定义按钮来触发元素的添加,而不是使用 InfoPath 提供的 "add element" 文本。
这里有一个例子可以更好地解释我的问题:
当用户在输入字段中输入内容时,我希望将其添加到重复部分的列表中。这是一个示例代码:
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("");
}
当我向列表中添加新元素时,它被添加到列表的顶部,而不是底部..
有什么建议吗?
尝试使用
CurrentView.ExecuteAction(ActionType.XCollectionInsert, "XmlToEdit");
这应该与内置信息路径 "add element" 做同样的工作。只需将 "XmlToEdit" 替换为您要插入的组的名称即可。
我使用的解决方案是在 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("");
}
我目前正在帮助客户使用 InfoPath 创建表单,但我在让列表按我想要的方式运行时遇到了一些问题。
每当我将新元素添加到列表(重复部分)时,它最终会出现在视图中列表的顶部,我希望它被添加到底部。我的客户想要一个自定义按钮来触发元素的添加,而不是使用 InfoPath 提供的 "add element" 文本。
这里有一个例子可以更好地解释我的问题:
当用户在输入字段中输入内容时,我希望将其添加到重复部分的列表中。这是一个示例代码:
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("");
}
当我向列表中添加新元素时,它被添加到列表的顶部,而不是底部..
有什么建议吗?
尝试使用
CurrentView.ExecuteAction(ActionType.XCollectionInsert, "XmlToEdit");
这应该与内置信息路径 "add element" 做同样的工作。只需将 "XmlToEdit" 替换为您要插入的组的名称即可。
我使用的解决方案是在 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("");
}