更改下一个同级的属性值

本文关键字:属性 下一个 | 更新日期: 2023-09-27 18:15:03

我试图从gridview中删除选定的节点,并更改该属性的每个下一个兄弟姐妹的Id属性。它删除了节点,但问题是它没有改变属性(减少id值1)。我认为问题是我的每个循环。

<Root>
  <Class Name="ECMInstruction" Style="Top">
    <Entity Id="1" Name="DocumentInformation" />
    <Property Id="1">
    </Property>
    <Property Id="2">
      <Lists>
        <ListName>ws_Users</ListName>
         <ListName>dfdfdfd</ListName>
      </Lists>
    </Property>
    <Property Id="3">
    </Property>
    <Property Id="4">
      <Lists>
        <ListName>ws_Users</ListName>
         <ListName>dfdfdfd</ListName>
      </Lists>
    </Property>
    <Property Id="5">
    </Property>
  </Class>
</Root>

和代码

XmlDocument xDoc = new XmlDocument();
xDoc.Load("sample.xml");
int value = 0;
foreach (DataGridViewRow row in dgv.SelectedRows)
{
    int rowval = row.Index;
    String propertyId = (dgv[0, rowval].Value.ToString());
    String propertyName = (dgv[1, rowval].Value.ToString());
    var nodeTobeRemoved = xDoc.SelectSingleNode("//Class[@Name='" + getCurClass() + "']");
    var confirmResult = MessageBox.Show("Are you sure to delete propert set '"" + propertyName + "'" ?", "Confirm Deletion!!", MessageBoxButtons.YesNo);
    if (confirmResult == DialogResult.Yes)
    {
        nodeTobeRemoved.RemoveChild(nodeTobeRemoved.SelectSingleNode("Property[@Name='" + propertyName + "']"));
        xDoc.Save("sample.xml");                       
        MessageBox.Show("Property set named '"" + propertyName + "'" from document class '"" + getCurClass() + "'" has been deleted !");
    }
    XmlNodeList ids = xDoc.SelectNodes("//Class[@Name='" + getCurClass() + "']/Property[@Id='" + propertyId + "']/following-sibling::Property");
    foreach (XmlNode i in ids)
    {
        int.TryParse(i.Attributes["Id"].Value, out value);
        value = value - 1;
        String newValue = value.ToString();
        i.Attributes["Id"].Value = newValue;
        xDoc.Save("sample.xml");
    }
    dgv.Rows.RemoveAt(rowval);
    dgv.ClearSelection();
    getProperties();
}

更改下一个同级的属性值

尝试选择已删除节点的以下兄弟节点。这是行不通的。

试试这样。(另外,如果您真的需要一个实际上什么都不做的ID属性—您可以通过在XPath中声明Property[3]来选择第三个<Property>,而id="3"没有任何实际用途,并且会导致您刚刚遇到的问题。)

XmlDocument xDoc = new XmlDocument();
xDoc.Load("sample.xml");
foreach (DataGridViewRow row in dgv.SelectedRows)
{
    var propertyId = dgv[0, row.Index].Value.ToString();
    var propertyName = dgv[1, row.Index].Value.ToString();
    var propertyNode = xDoc.SelectSingleNode("//Class[@Name='" + getCurClass() + "']/Property[@Name='" + propertyName + "']");
    if (propertyNode != null) {
        var remainingProperties = propertyNode.SelectNodes("./following-sibling::Property");
        var confirmMessage = "Are you sure to delete property set '"" + propertyName + "'" ?";
        if (MessageBox.Show(confirmMessage, "Confirm Deletion!!", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            foreach (XmlNode p in remainingProperties)
            {
                var idAttr = p.Attributes["Id"];
                if (idAttr != null) {
                    int value = 0;
                    if (int.TryParse(idAttr.Value, out value)) {;
                        idAttr.Value = (value - 1).ToString();
                    }
                }
            }
            propertyNode.ParentNode.RemoveChild(propertyNode);
        }
        xDoc.Save("sample.xml");
        dgv.Rows.RemoveAt(rowval);
        dgv.ClearSelection();
        getProperties();
    }
}
选择

  • 您可以使用propertyNode.SelectNodes("./preceding-sibling::Property").Count + 1作为@id的值,而不是int.TryParse()等。
  • 完全删除@id属性,省去你自己的麻烦。

我找到了问题的答案。我基本上改变了选中属性的所有兄弟属性的Id变量然后剩下两个Id相同但名称不同的属性。最后,我删除了所选名称的属性。瞧!

        XmlDocument xDoc = new XmlDocument();
        xDoc.Load("sample.xml");
        foreach (DataGridViewRow row in dgv.SelectedRows)
        {
            int rowval = row.Index;
            String propertyID = (dgv[0, rowval].Value.ToString());
            String propertyName = (dgv[1, rowval].Value.ToString());
            var propertyNode = xDoc.SelectNodes("//Class[@Name='" + getCurClass() + "']/Property[@Id='" + propertyID + "']/following-sibling::Property");
            if (propertyNode != null)
            {
                var confirmMessage = "Are you sure to delete propert set '"" + propertyName + "'" ?";
                if (MessageBox.Show(confirmMessage, "Confirm Deletion!!", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    foreach (XmlNode p in propertyNode)
                    {
                        int value = 0;
                        int.TryParse(p.Attributes["Id"].Value, out value);
                        value = value - 1;
                        String newValue = value.ToString();
                        p.Attributes["Id"].Value = newValue;
                        xDoc.Save("sample.xml");
                    }
                }
            }
            var selectedRow = xDoc.SelectSingleNode("//Class[@Name='" + getCurClass() + "']/Property[@Name='" + propertyName + "']");
            selectedRow.ParentNode.RemoveChild(selectedRow);
            xDoc.Save("sample.xml");
        }