dinamik bir treeview oluşturmaya çalışıyorum. tablosu gayet basit.
FolderID FolderName ParentID
Kullanıcı yeni klasör dediği zaman seçili olan klasörü bulup onun altına ad kısmı boş olan yeni bir klasör açmak istiyorum. Klasör adını kullanıcı girdikten sonra yazmam gereken parentID yi nasıl bulacağım. yani bu klasör neyin altında?
create ederken problem oluşuyor. Çünkü iki aynı klasör adı varsa sql bana iki kayıt döndürüyor. ama ben sadece 1. kayıdı create edebiliyorum?
böyle bir örnek yapabilirmisiniz ?
treeview create
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Burada bir tasarım hatası söz konusu. Tabloda tekil bir alan olmalı (unique key), ki bu da muhtemelen FolderID olacaktır. Yapacağınız sorgu FolderName üzerinden değil de FolderID üzerinden olmalı. Bu sayede çoklu sonuçlar almazsınız.
Eğer "TreeView"daki elemanların FolderID'lerini tutmak istiyorsanız, genelde kullandığım metodu vereyim. Biraz karışık olabilir.
Yeni bir uygulama oluşturun. (Form1) üzerine (TreeView1), (Button1) ve (Label1) koyun.
(TreeView1)e veri eklemek için:
Verilerin "FolderID"lerini okumak için
Anlaşılmayan bir nokta varsa çekinmeden sorunuz.
Ertuğ Kaya
Eğer "TreeView"daki elemanların FolderID'lerini tutmak istiyorsanız, genelde kullandığım metodu vereyim. Biraz karışık olabilir.
Yeni bir uygulama oluşturun. (Form1) üzerine (TreeView1), (Button1) ve (Label1) koyun.
(TreeView1)e veri eklemek için:
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
var
aTreeNode: TTreeNode;
begin
aTreeNode := TreeView1.Items.AddFirst(nil, 'İlk');
aTreeNode.Data := Pointer(1); { <- bu hardcoded 1 yerine veritabanından veri atamalısınız. Yapılan iş, elemanın "Tag"ine sayı atamak gibi düşünülebilir. Ama "Data"nın türü Pointer olduğundan sayıyı "Pointer"a typecast etmeliyiz (ikisi de 4 byte, cast edilebilir) }
aTreeNode := TreeView1.Items.AddChild(aTreeNode, 'İkinci');
aTreeNode.Data := Pointer(2);
end;
Kod: Tümünü seç
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Assigned(Node) then
Label1.Caption := IntToStr(Integer(Node.Data)); //yukardaki "cast"in tersini yapıyoruz
end;
Ertuğ Kaya