Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Xml'den Treeview'e aktarma sorunu (c#, çok eğlenceksiniz)


Öne çıkan mesajlar

Mesaj tarihi:
Ş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.
Mesaj tarihi:
ö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..
Mesaj tarihi:
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=}
Mesaj tarihi:
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.
Mesaj tarihi:
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
Mesaj tarihi:
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.
Mesaj tarihi:
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;
}

Mesaj tarihi:
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.
Mesaj tarihi:
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> <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ı?:)
×
×
  • Yeni Oluştur...