开发者

how do i select the node's index?

I have a xml populated combobox. If builderemail (from parsing of text using streamreader) is equals to the any one value found in the xml file, the combobox will select the index. how do i go about selecting it?

    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))
                           开发者_JAVA技巧     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;
                            }
                         }

the place to look at is here:

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


I believe this code does everything that you want your code to do. This code is certainly not perfect, and may not even work, but if you compare it to yours you should find that it employs probably half a dozen practices that you're not following in your code and probably should be. If you cut out all the assertions, you'll find that it's only 10 lines of code (not counting the refactored method).

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

And here's the method for creating the builderemail element - which, by the way, should be named builderEmail if you have any say over it:

// 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);
}

Also, is there a reason that your XML has a separate value element under builderEmail, instead of builderEmail just containing the value?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜