Laorx Mesaj tarihi: Nisan 13, 2009 Mesaj tarihi: Nisan 13, 2009 Şimdi elimizde example.xml olduğunu sonra bunu programımızdaki Treeview1'in içine aktarmamız gerektiğini düşünelim ilk açıldığında. Example.xml said: - - - $2.50 20 - $1.50 10 - - $4.50 60 Buraya kadar yaptım. Yani sorunsuz bir şekilde atabiliyorum. Sorunuma gelirsek Xml'in içinden Treeview'e aktarırken tüm Xml'i değilde ilk 2 level'ı yani ilk node'u sonra childnode'u en son node'u (yani 0-1-2 level düşünürsek 2. level'ı) yüklememek Treeview'a. Yazdığım kod şöyle birşey. Sıkıcı değil kaçmayın plz:) Hebe said: //Açılışta gui'me yüklemede bu addNodesInStartuP ile yüklüyorum private void addNodesInStartuP() { XmlDocument xDoc = new XmlDocument(); string strFilename = "C:UsersACERDesktopXmlSavingexample.xml"; if (File.Exists(strFilename)) xDoc.Load(strFilename); else Console.WriteLine("The file {0} could not be located", strFilename); if (File.Exists(strFilename)) { try { //node'lar yüklenirken cursor beklesin şöyle this.Cursor = Cursors.WaitCursor; xDoc.Load(strFilename); //Şimdi ilk nodeları yükleyelim tabi bi silelim ilk başta temiz çalışalım treeView1.Nodes.Clear(); treeView1.Nodes.Add(new TreeNode(xDoc.DocumentElement.Name)); TreeNode tNode = new TreeNode(); tNode = (TreeNode)treeView1.Nodes[0]; //Addtreenode methodunu çağırıp nodeları ekliyorum addTreeNode(xDoc.DocumentElement, tNode); //Expand treeview treeView1.ExpandAll(); } catch (XmlException xExc) //Exception { MessageBox.Show(xExc.Message); } catch (Exception ex) //General exception { MessageBox.Show(ex.Message); } finally { this.Cursor = Cursors.Default; } } } // Bu ilk bulduğum method şimdilik bakmasanız olur yukardaki method'un aynısı ama elle seçiliyo fln xml private void populateTreeview() { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open XML Document"; dlg.Filter = "XML Files (*.xml)|*.xml"; dlg.FileName = Application.StartupPath + "....example.xml"; if (dlg.ShowDialog() == DialogResult.OK) { try { this.Cursor = Cursors.WaitCursor; XmlDocument xDoc = new XmlDocument(); xDoc.Load(dlg.FileName); treeView1.Nodes.Clear(); treeView1.Nodes.Add(new TreeNode(xDoc.DocumentElement.Name)); TreeNode tNode = new TreeNode(); tNode = (TreeNode)treeView1.Nodes[0]; addTreeNode(xDoc.DocumentElement, tNode); treeView1.ExpandAll(); } catch (XmlException xExc) { MessageBox.Show(xExc.Message); } } } //İşte Asıl yardım edilcek Method burası sayılabilir, cunku burada recursively çağırılıyo fonksiyon nodelar bitene kadar private void addTreeNode(XmlNode xmlNode, TreeNode treeNode) { XmlNode xNode; TreeNode tNode; XmlNodeList xNodeList; if (xmlNode.HasChildNodes) //The current node has children { xNodeList = xmlNode.ChildNodes; for (int x = 0; x <= xNodeList.Count - 1; x++) //Loop { //Childlarla nası oynıcamda eklemicem istediğim node'u yada xml level'ını? xNode = xmlNode.ChildNodes[x]; treeNode.Nodes.Add(new TreeNode(xNode.Name)); tNode = treeNode.Nodes[x]; addTreeNode(xNode, tNode); } } else //Child Node'um yoksa! treeNode.Text = xmlNode.OuterXml.Trim(); } sorunum kolay aslında ama child'larla oynamaya kasamadım.
Laorx Mesaj tarihi: Nisan 13, 2009 Konuyu açan Mesaj tarihi: Nisan 13, 2009 başlık "aktarma sorunu" olcak. sdf
Ractamainus Mesaj tarihi: Nisan 14, 2009 Mesaj tarihi: Nisan 14, 2009 öncelikle belirtmek isterim, bence xml yapısı pek olmamış. Eğer ki senin yarattığın bir xml ise, değiştirsen iyi olur.. her "drink" ya da "snack" altında, element isimlerini item ismi yapman, yapı içinde dolaşmanı zorlaştırır. (drink ya da snack gibi spesifik kategoriler de çok fazlaysa, onları da aşağıda anlattığım gibi standartlaştırmalısın aslında.) misal: <drink> <item name="lemonade"> ... </item> ... </drink> ya da <drink> <item> <name>lemonade</name> <price>3</price> ... </item> ... </drink> yaklaşımı senin de, senden sonrakilerin de işini kolaylaştırır. diğer konuya gelince.. bilmiyorum hiç kullandın mı ama linq gibi çok güzel, belirli data source'ları manipule etmeni (sorgulamak ya da eklemek vs için), benim çok hoşlaştığım bir metodoloji var. seni tam olarak anladım mı emin değilim =) sanırım inventory > dring > lemonade'e kadar olan yapıyı istiyorsun(?) ben senin aradığın çözüme (linq kullanarak) şöyle giderdim; public class XItems { public string Name { get; set; } public List<string> Childs { get; set; } } private void Form1_Load(object sender, EventArgs e) { XDocument inventory = XDocument.Load("XMLFile1.xml"); List<XItems> hasan = GetItems(inventory); //burada aslında, treeview içine generic list'i gömeceksin.. foreach (XItems item in hasan) { MessageBox.Show(item.Name); foreach (string child in item.Childs) { MessageBox.Show(child); } } } List<XItems> GetItems(XDocument xml) { List<XItems> query = (from item in xml.Element("inventory").Elements() select new XItems() { Name = item.Name.ToString(), Childs = (from c in item.Elements() select ( c.Name.ToString() )).ToList() }).ToList(); return query; } } kusura bakma yemeğe çıkmam lazım =P pek açık olamadım ama yazabilirim arada, eğer bir şeyler yazarsan. edit: yine smiley..
Laorx Mesaj tarihi: Nisan 14, 2009 Konuyu açan Mesaj tarihi: Nisan 14, 2009 Evt anlamışsın sorunumu ehehe. Verdiğin kodu denedim, güzelmiş tektek bastı msgbox'da ama işte asıl treeview'e gömme brz karışık(denedim senin methodla birleştirmeyi çıkamadım işin içinden). Ama linq'i öğrendiğim iyi oldu eyv. Zaten şimdilik bi çözüm buldum gibi sorunuma, ilerde sorum olursa burdan iletişime geçeriz=}
Ractamainus Mesaj tarihi: Nisan 14, 2009 Mesaj tarihi: Nisan 14, 2009 hmm treeview'e gömmek aslında, foreach içinde node'lara basmaktan ibaret, nitekim elinde artık datasource olarak kullanabileceğin bir list var. çift katmanlı olduğu için iç içe iki döngü (ya da recursive falan) olabilirdi.. şimdi elimde bir ide yok, windows.forms.treeview ile de hiç çalışmamıştım daha önce. örnek bir kod çıkarırsam sallamış olurum, elleşmeyeyim =) kolay gele.
riglous Mesaj tarihi: Nisan 15, 2009 Mesaj tarihi: Nisan 15, 2009 Depth katarsan olur (istersen depthLimit diye 2. bi degisken koyup daha dinamik yapabilirsin) said: private void populateTreeview() { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Open XML Document"; dlg.Filter = "XML Files (*.xml)|*.xml"; dlg.FileName = Application.StartupPath + "....example.xml"; if (dlg.ShowDialog() == DialogResult.OK) { try { this.Cursor = Cursors.WaitCursor; XmlDocument xDoc = new XmlDocument(); xDoc.Load(dlg.FileName); treeView1.Nodes.Clear(); treeView1.Nodes.Add(new TreeNode(xDoc.DocumentElement.Name)); TreeNode tNode = new TreeNode(); tNode = (TreeNode)treeView1.Nodes[0]; addTreeNode(xDoc.DocumentElement, tNode, 2); treeView1.ExpandAll(); } catch (XmlException xExc) { MessageBox.Show(xExc.Message); } } } private void addTreeNode(XmlNode xmlNode, TreeNode treeNode, int depth) { XmlNode xNode; TreeNode tNode; XmlNodeList xNodeList; if ((xmlNode.HasChildNodes) && (depth>0)) //The current node has children { xNodeList = xmlNode.ChildNodes; for (int x = 0; x <= xNodeList.Count - 1; x++) //Loop { //Childlarla nası oynıcamda eklemicem istediğim node'u yada xml level'ını? xNode = xmlNode.ChildNodes[x]; treeNode.Nodes.Add(new TreeNode(xNode.Name)); tNode = treeNode.Nodes[x]; addTreeNode(xNode, tNode, depth-1); } } else //Child Node'um yoksa! treeNode.Text = xmlNode.OuterXml.Trim(); } gibi
Ractamainus Mesaj tarihi: Nisan 15, 2009 Mesaj tarihi: Nisan 15, 2009 ben de başladığımı bitirmiş oluyum: public class XItems { public string Name { get; set; } public List<string> Childs { get; set; } } private void Form1_Load(object sender, EventArgs e) { XDocument inventory = XDocument.Load("XMLFile1.xml"); List<XItems> nodeItems = GetItems(inventory); treeView1.BeginUpdate(); treeView1.Nodes.Clear(); foreach (XItems item in nodeItems) { treeView1.Nodes.Add(new TreeNode(item.Name)); foreach (string child in item.Childs) { treeView1.Nodes[nodeItems.IndexOf(item)].Nodes.Add(new TreeNode(child)); } } treeView1.EndUpdate(); } List<XItems> GetItems(XDocument xml) { List<XItems> query = (from item in xml.Element("inventory").Elements() select new XItems() { Name = item.Name.ToString(), Childs = (from c in item.Elements() select ( c.Name.ToString() )).ToList() }).ToList(); return query; } edit: smileyler beni öldürecek.. bir de "code" tagına aldığımızda, alıntı yapmış gibi arka planı da beyaz falan yapsa güzel olur sanki.
riglous Mesaj tarihi: Nisan 15, 2009 Mesaj tarihi: Nisan 15, 2009 quote -> code uygulayinca kismen oluyor ;) spoiler -> code olunca daha bi iyi durdu ama o da 528px'lik said: List<XItems> GetItems(XDocument xml) { List<XItems> query = (from item in xml.Element("inventory").Elements() select new XItems() { Name = item.Name.ToString(), Childs = (from c in item.Elements() select ( c.Name.ToString() )).ToList() }).ToList(); return query; }
Ractamainus Mesaj tarihi: Nisan 15, 2009 Mesaj tarihi: Nisan 15, 2009 deneme spolier -> code List<XItems> GetItems(XDocument xml) { List<XItems> query = (from item in xml.Element("inventory").Elements() select new XItems() { Name = item.Name.ToString(), Childs = (from c in item.Elements() select ( c.Name.ToString() )).ToList() }).ToList(); return query; } :) spoilerın rengi daha güzel oluyormuş.. bir de overflow hadisesi sorun olmasa.
Laorx Mesaj tarihi: Nisan 15, 2009 Konuyu açan Mesaj tarihi: Nisan 15, 2009 Ractamainus bu sefer yolladığın oldu galiba, sağol>:D< @riglous- depth'i denedim, güzelde oldu ama 2leveldan sonra bütün childları 2'nin altında gösterdi nedense. şu şekil gibi said: 1- 2- <3>3> <4>4> Sağol genede. Arkadaşlar bi sorum daha var, şimdi [30][30] luk double bir array'deki bilgilerimi boş bir Xml dosyasına string şeklindemi kaydetsem daha mantıklı yoksa bit bit integermı?:)
reyou Mesaj tarihi: Nisan 16, 2009 Mesaj tarihi: Nisan 16, 2009 string olarak gir iste, okumasida kolay yazmasida..
Laorx Mesaj tarihi: Nisan 21, 2009 Konuyu açan Mesaj tarihi: Nisan 21, 2009 bir sorum daha var şimdi treeview'a eklediğim yeni bir node'un daha önce listede olup olmadığını nası kontrol edebilirim?
Öne çıkan mesajlar