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 فیلد عنوان گره هستش که با تایپ کاربر در کادر جستجو باید بر اساس اون عمل فیلتر صورت بگیره
این دستور اجرا میشه ، اما فقط در سطح گره های پدر و در سطح های داخلی اعمال نمیشه
و چون شرط اولش هم در داخل گره های فرزند ، برقرار نمیشه ، گره های فرزند رو هم نشون نمیده.
حالا میخواستم بدونم ، آیا روشی برای اعمال فیلتر روی لیست درختی سراغ دارید
چه اینکه روی این کد اعمال بشه
یا اینکه یک کد دیگه باشه
امیدوارم منظورم رو کامل رسونده باشم
یا حق
من یک لیست درختی دارم که اون رو با 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 فیلد عنوان گره هستش که با تایپ کاربر در کادر جستجو باید بر اساس اون عمل فیلتر صورت بگیره
این دستور اجرا میشه ، اما فقط در سطح گره های پدر و در سطح های داخلی اعمال نمیشه
و چون شرط اولش هم در داخل گره های فرزند ، برقرار نمیشه ، گره های فرزند رو هم نشون نمیده.
حالا میخواستم بدونم ، آیا روشی برای اعمال فیلتر روی لیست درختی سراغ دارید
چه اینکه روی این کد اعمال بشه
یا اینکه یک کد دیگه باشه
امیدوارم منظورم رو کامل رسونده باشم
یا حق