2012-07-26 79 views
0

這是我的xml文件;如何將xml數據綁定到comboBox以製作智能?

<UserClass> 
    <Id>1</Id> 
    <Name>oss</Name> 
    <Address> 
    <Id>1</Id> 
    <Street>asstreet</Street> 
    </Address> 
</UserClass> 

所以我想將這些「節點」添加到組合框項目。 當用戶輸入UserClass並輸入「。」(點)到「UserClass」的末尾時; ID,名稱和其他東西必須在組合框中列出。

用戶鍵入「UserClass」。和 - > combobox得到這些;

UserClass.Id 
UserClass.Name 
UserClass.Address.Id 
UserClass.Address.Street 

我嘗試了很多東西,包括那一個;

... 
    try 
    { 
     string parsedNode = ParseComboBox(); 
     XmlReader rdr = XmlReader.Create(new System.IO.StringReader(_globalXml)); 

     comboBox1.Items.Clear(); 
     while (rdr.Read()) 
     { 
      if (rdr.NodeType == XmlNodeType.Element) 
      { 
       comboBox1.Items.Add(rdr.LocalName); 
      } 

      comboBox1.DroppedDown = true; 
     } 



     //string parsedNode = ParseComboBox(); 
     //XmlNodeList childList = xml.GetElementsByTagName(parsedNode); 

     ////comboBox1.Items.Clear(); 
     //foreach (XmlNode node in childList) 
     //{ 
     // foreach (var osman in node.ChildNodes) 
     // { 
     //  comboBox1.Items.Add(parsedNode + "." + osman); 
     // } 
     //} 


    } 
    catch (Exception) 
    { 
     MessageBox.Show("fuuu"); 
    } 
}... 

    private string ParseComboBox() 
    { 
     string resultAsXmlNodes = null; 
     string text = comboBox1.Text; 

     if (text.EndsWith(".")) 
     { 
      char[] delimiterChars = { '.' }; 

      string[] words = text.Split(delimiterChars); 

      foreach (string s in words) 
      { 
       resultAsXmlNodes += s; 
      } 
     } 

     return resultAsXmlNodes; 
    } 

它工作不正常。我相信有一個簡單的方法來做到這一點。 那麼,簡單的方法是什麼?或者乾脆, 如何在comboBox中顯示節點名稱?

+0

快速瀏覽一下,您的XML解析看起來是不正確的。如果你將責任分離了一點,並且創建一個函數來從給定節點返回所需的字符串,也許調試起來會更容易?一旦你有這個列表,將它綁定到組合框將會簡單得多 – Origin 2012-07-26 15:47:57

回答

1

我發現了這個問題。以下是我使用XML文件和一個ComboBox控件爲表單項目工作的一些示例代碼:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Xml; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      comboBox1.KeyDown += comboBox1_KeyDown; 
     } 

     private void comboBox1_KeyDown(object sender, KeyEventArgs e) 
     { 
      switch (e.KeyCode) 
      { 
       case Keys.Decimal: 
       case Keys.OemPeriod: 
        LoadComboItems(comboBox1.Text); 
        break; 
       default: 
        break; 
      } 
     } 

     void LoadComboItems(string userInput) 
     { 
      comboBox1.Items.Clear(); 
      string lookupName = userInput.Trim(); 
      if (lookupName.Length > 0) 
      { 
       string _globalXML = Application.StartupPath + @"\XMLFile1.xml"; 
       XmlReader rdr = XmlReader.Create(_globalXML); 

       while (rdr.Read()) 
       { 
        if (rdr.LocalName == lookupName) 
        { 
         string ElementName = ""; 
         int eCount = 0; 
         int prevDepth = 0; 
         while (rdr.Read()) 
         { 
          if (rdr.NodeType == XmlNodeType.Element) 
          { 
           ElementName += '.' + rdr.LocalName; 
           eCount++; 
          } 
          else if (rdr.NodeType == XmlNodeType.EndElement && eCount == rdr.Depth) 
          { 
           if (rdr.Depth >= prevDepth) 
           { 
            comboBox1.Items.Add(lookupName + ElementName); 
            int pos = ElementName.LastIndexOf('.'); 
            ElementName = ElementName.Substring(0, pos); 
            prevDepth = rdr.Depth; 
           } 
           eCount--; 
          } 
         } 

        } 
       } 

       if (rdr != null) 
       { 
        rdr.Close(); 
       } 

       comboBox1.DroppedDown = true; 
      } 
     } 
    } 
} 
+0

非常感謝你的盟友。你的答案是一個解決方案,它有小錯誤(當用戶,但光標選擇移動到第一個字符),但它的工作。但這對於這份工作來說代碼太多了。我試圖用最佳實踐來解決它。如果您添加了書籤或觀看此主題,則會看到我的代碼(當我正確解決問題時)。再一次非常感謝你。 – 2012-07-27 05:07:19

相關問題