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("");
}