0

ノードが含まれてTreeViewおり、そのうちの1つをクリックすると、ファイルや塗りつぶしTextBoxesなどからデータがロードされます。重複が作成されないようにしたいので、textBoxの「タイトル」に.xmlファイルに既に存在するエントリが含まれるたびに、削除されます. 私の問題は、エントリを追加するボタンを最初にクリックした後、すべて問題ないことです。しかし、2回目のクリック(textBox.Text値は変更されていないため、複製されます)の後、変更してもノードが消えます。ダブルクリックするたびに、treeView の新しい子ノードが追加されます。自分でやろうとしましたが、アイデアが尽きてしまいました。

ボタンコード:

        private void button1_Click(object sender, EventArgs e)
    {


        XDocument doc = XDocument.Load("test.xml");
        bool ifDuplicate = doc.Descendants("dog")
                        .Any(x => (string)x.Attribute("name") == textBox1.Text);
        if (ifDuplicate == true)
        {
            var xElement = (from q in doc.Elements("dogs").Elements("dog")
                            where q.Attribute("name").Value == textBox1.Text
                            select q);
            foreach (var a in xElement)
                a.Remove();
            doc.Save("test.xml");
            return;
        }

            gender(); //determines in which root node this entry will appear as child node; just comboBox with few exceptions
            TreeViewOperations.SaveTree(treeView1, "test2.xml"); //saving treeView1
            Save("test.xml"); //saving file that contains data form textBoxes etc.
            statusBarUpdate();

    }

私の質問は、既存のノードを変更して重複を削除するより良い方法はありますか? 必要に応じて Load メソッドをアタッチすることもできます。

編集:保存方法

    private void Save(string filename)
    {
        XDocument database = XDocument.Load(filename);
        XElement dog = new XElement("dog");
        database.Element("dogs").Add(dog);
        dog.Add(new XAttribute("name", textBox1.Text));
        dog.Add(new XElement("breed", comboBox3.Text));
        dog.Add(new XElement("sex", radioButton3.Checked));
        database.Save(filename);
    }
4

1 に答える 1

1

新しいアイテムを追加する方法が妨げられるため、問題はブロックreturn内にあると思います。if (ifDuplicate)

これが私が使用する解決策です:

private void button1_Click(object sender, EventArgs e)
{
    XDocument doc = XDocument.Load("test.xml");

    // Removes all existing elements
    foreach (XElement xElement in from q in doc.Elements("dogs").Elements("dog")
                                  where q.Attribute("name").Value == textBox1.Text
                                  select q)
        xElement.Remove();

    gender(); //determines in which root node this entry will appear as child node; just comboBox with few exceptions
    TreeViewOperations.SaveTree(treeView1, "test2.xml"); //saving treeView1
    Save("test.xml"); //saving file that contains data form textBoxes etc.
    statusBarUpdate();
}
于 2013-07-24T23:59:56.193 に答える