Как выбрать индекс узла? - PullRequest
0 голосов
/ 21 марта 2011

У меня есть заполненный xml комбинированный список.Если buildderemail (из анализа текста с использованием streamreader) равен любому значению, найденному в XML-файле, выпадающий список выберет индекс.как мне выбрать его?

    if (line.StartsWith("Builder_Email:"))
                        {   
                            bool IsNodeExists = false;
                            string[] fields = line.Split('\t');
                            string builderemail = fields[3];
                            XmlDocument emailparse = new XmlDocument();
                            emailparse.Load(@"C:\GUI\buildermanageremail.xml");
                            XmlNodeList emailnode = emailparse.GetElementsByTagName("value");
                            if (string.IsNullOrEmpty(builderemail))
                                comboBox1.SelectedIndex = -1;
                            else
                            foreach (XmlNode node in emailnode)
                            {
                                if (builderemail == node.InnerText)
                                {
                                // how do i get the combobox selection right?
                                // need some code here
                                    IsNodeExists = true;
                                    break;
                                }
                            }
                            if(!IsNodeExists)
                            {
                                //create main node
                                XmlNode abc = emailparse.CreateNode(XmlNodeType.Element, "builder", null);

                                //create the first child node
                                XmlNode value = emailparse.CreateElement("value");
                                //set the value
                                value.InnerText = builderemail;

                                // add childes to father
                                //node.AppendChild(id);
                                abc.AppendChild(value);

                                // find the node we want to add the new node to
                                XmlNodeList l = emailparse.GetElementsByTagName("builderemail");
                                // append the new node
                                l[0].AppendChild(abc);
                                // save the file
                                emailparse.Save(@"C:\GUI\buildermanageremail.xml");

                                //then we populate the new updated xml file into the drop down list:
                                PopulateDDLFromXMLFile();   

                                int count = emailparse.SelectNodes("email/builderemail/builder").Count;
                                count--;
                                comboBox1.SelectedIndex = count;
                            }
                         }

место для просмотра здесь:

foreach (XmlNode node in emailnode)
                            {
                                if (builderemail == node.InnerText)
                                {
                                // how do i get the combobox selection right?
                                // need some code here
                                    IsNodeExists = true;
                                    break;
                                }
                            }

1 Ответ

0 голосов
/ 21 марта 2011

Я считаю, что этот код делает все, что вы хотите, чтобы ваш код делал. Этот код, конечно, не идеален и может даже не работать, но если вы сравните его с вашим, вы обнаружите, что он использует, вероятно, полдюжины методов, которых вы не придерживаетесь в своем коде, и, вероятно, так и должно быть. Если вы удалите все утверждения, вы обнаружите, что это всего 10 строк кода (не считая рефакторинг метода).

if (line.StartsWith("Builder_email:"))
{
   Debug.Assert(
      line.Where(x => x == '\t').Count() > 2), 
      "Can't parse input line.");
   string builderEmail = line.Split('\t')[3];
   Debug.Assert(
       builderEmail != null && builderEmail == builderEmail.Trim(),
      "Input data is bad.");
   string filename = @"C:\GUI\buildermanageremail.xml"
   Debug.Assert(
      File.Exists(filename),
      "Expected XML file does not exist.");
   XmlDocument emailXml = new XmlDocument();
   emailXml.Load(filename);

   // In your real application, you know the name of the document element, so you
   // should replace * with it in the XPath below.
   string xpath = string.Format(
      "/*/builderemail/builder/value[.='{0}']", 
      builderEmail);
   if (emailXml.SelectSingleNode(xpath) == null)
   {
      CreateBuilderEmailElement(emailXml, builderEmail);
      emailXml.Save(filename);
      // I've changed the name of this method, which is problematic for several
      // reasons - not least of which is that in my world, at least, "DDL" means
      // "Data Definition Language."
      //
      // This also assumes that you've created an overload of the method that
      // takes an XmlDocument argument.
      PopulateEmailComboBox(emailXml);
   }
   // I'm assuming that the builderEmail is the actual text value stored in the
   // combo box items, in which case all you need to do is find the item with that
   // value and set SelectedItem, which will automatically set SelectedIndex.  Also,
   // if the value isn't found, setting SelectedItem to null automatically sets
   // SelectedIndex to -1.
   builderEmailComboBox.SelectedItem = builderEmailComboBox.Items
      .Where(x => x.ToString() == builderEmail)
      .FirstOrNull();
}

А вот метод создания элемента builderemail, который, кстати, должен называться builderEmail, если вы хотите сказать о нем:

// this is refactored out as its own function, and made internal so that you
// can unit test it.
internal void CreateBuilderEmailElement(XmlDocument emailXml, string builderEmail)
{
      XmlElement builder = emailXml.CreateNode("builder");
      XmlElement value = emailXml.CreateNode("value");
      builder.AppendChild(valueElm);
      value.InnerText = builderEmail;
      // again, you know the name of the document element in your application,
      // so replace the * below with it.
      Debug.Assert(
         emailXml.SelectSingleNode("/*/builderemail") != null,
         "No builderemail element found under the document element.");
      emailXml.SelectSingleNode("/*/builderemail").AppendChild(builder);
}

Кроме того, есть ли причина, по которой в вашем XML есть отдельный элемент value в builderEmail вместо builderEmail, просто содержащий значение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...