PDA

View Full Version : سوال: فیلتر کردن Treview (لیست درختی)



hadisalahi2
دوشنبه 01 دی 1393, 12:20 عصر
سلام به دوستان

من یک لیست درختی دارم که اون رو با Tree view معمولی دلفی پیاده سازی کردم

برای ایجاد لیست از یک تابع بازگشتی به صورت زیر استفاده می کنم:



procedure TComponentForm.CreateTree(tree: TTreeView; node: TTreeNode;code: Integer);
var
i: Integer;
list1, list2: Tstringlist;
newnode: TTreeNode;
begin


list1 := Tstringlist.Create;
list2 := Tstringlist.Create;
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'Select * From TreeListTable where parentid=' + inttostr(code);
ADOQuery1.Open;


while not ADOQuery1.eof do
begin
list1.Add(ADOQuery1.fieldbyname('title_f').asstrin g);
list2.Add(ADOQuery1.fieldbyname('nodeid').asstring );
ADOQuery1.next;
end;
ADOQuery1.Close;


for i := 0 to list1.count - 1 do
begin
newnode := tree.Items.AddChild(node, list1.strings[i]);
newnode.StateIndex := strtoint(list2.strings[i]);
newnode.SelectedIndex := 4;
CreateTree(tree, newnode, strtoint(list2.strings[i]));
end;


list1.free;
list2.free;
end;



این پروسیجر بسیار عالی عمل میکنه و لیست درختی رو بر اساس گره پدر ایجاد میکنه

اما یک مشکل اساس وجود داره
با توجه به اینکه این تابع داخل خودش دستور Select رو داره



ADOQuery1.Close;
ADOQuery1.SQL.Text := 'Select * From TreeListTable where parentid=' + inttostr(code);
ADOQuery1.Open;


و با توجه به اینکه بازگشتی هستش ، امکان نوستن یک کوئری دیگه امکان پذیر نیست

من برای اعمال فیلتر روی لیست درختی (جستجو) اومدم و یک شرط دیگه به دستور بالا به صورت زیر اضافه کردم



ADOQuery1.SQL.Text := 'Select * From TreeListTable where (parentid=' +
inttostr(code) + ')AND(title_f like :P1)';
ADOQuery1.Parameters.ParamByName('P1').Value := Value + '%';


اون title_f فیلد عنوان گره هستش که با تایپ کاربر در کادر جستجو باید بر اساس اون عمل فیلتر صورت بگیره

این دستور اجرا میشه ، اما فقط در سطح گره های پدر و در سطح های داخلی اعمال نمیشه

و چون شرط اولش هم در داخل گره های فرزند ، برقرار نمیشه ، گره های فرزند رو هم نشون نمیده.



حالا میخواستم بدونم ، آیا روشی برای اعمال فیلتر روی لیست درختی سراغ دارید
چه اینکه روی این کد اعمال بشه
یا اینکه یک کد دیگه باشه


امیدوارم منظورم رو کامل رسونده باشم

یا حق

rahnema1
چهارشنبه 03 دی 1393, 10:01 صبح
سلام
شما فقط با همون شرط parentid=code دستور select درخت را پر می کنید اما وقتی در treeview به گرهی برسید که اولا فرزند نداشته باشه و ثانیا title_f اون برابر P1 نباشه اون گره را حذف می کنید و به شاخه بالاتر می روید و این شرط را برای گره های بالاتر چک می کنید تا حذف بشن.
به اولین گرهی که برسید که این شرط در موردش صادق نبود دیگه لازم نیست به سمت بالا برید