关于treeview的问题?

seawavefj 2003-05-13 09:09:17
如:
--总经理室
------总经理
------副总经理
--经理室
------经理
--部门
-------软件开发部
-------市场部
-------销售部

我要的是按如:总经理,就把总经理的资料调出来,用DBGRID显示,按总经理室或部门等不显示其内容,要怎么写呢?请赐教!
...全文
56 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
307 2003-05-13
  • 打赏
  • 举报
回复
同意: gwsr(咩咩)
有问题请发信息到我的E-mail:guangbowang@yahoo.com.cn
ihihonline 2003-05-13
  • 打赏
  • 举报
回复
动态生成树。我可不是来枪分啊!
procedure TPublicClass.TreeViewAddT(MFieldStr, DFieldStr,
TableNameValue: String; Sender: TTreeView; ImageValue: TImageList);
var
PNode , CNode : TTreeNode;
I : Integer;
begin
Sender.Items.Clear;
Sender.Images := ImageValue;
With DataModuleFrm.Temp1ADOQuery do
begin
if Active then
Active := False;
SQL.Clear;
SQL.Add('Select Distinct ' + MFieldStr + ' from ' + TableNameValue);
Prepared;
Open;
First;
While Not Eof do
begin
PNode := Sender.Items.AddChild(Nil,Trim(FieldByName(MFieldStr).AsString));
PNode.ImageIndex := 0;
if PNode.Level = 1 then
begin
PNode.ImageIndex := 2;
Pnode.StateIndex := 4;
end; {}
Next;
end;
end;
With DataModuleFrm.LSB_ADOQuery do
begin
Sender.SetFocus;
For I := Sender.Items.Count -1 DownTo 0 do
begin
PNode := TTreeNode.Create(Nil);
PNode := Sender.Items[I];
if Active then
Active := False;
SQL.Clear;
SQL.Add('Select ' + DFieldStr + ' from ' + TableNameValue + ' Where ' +
MFieldStr + ' = ' + #39 + Sender.Items[I].Text + #39);
Prepared;
Open;
First;
While Not Eof do
begin
CNode := Sender.Items.AddChild(PNode,Trim(FieldByName(DFieldStr).AsString));
CNode.ImageIndex := 1;
if PNode.Level = 1 then
begin
PNode.ImageIndex := 2;
Pnode.StateIndex := 4;
end;{}
Next;
end;
end;
end;
esu 2003-05-13
  • 打赏
  • 举报
回复
你的动态是生成树还是什么
我的方法不可以吗
ihihonline 2003-05-13
  • 打赏
  • 举报
回复
改了一下;
function Tthrgzzxbzhwhfrm.ResultString(IntValue : Integer): String;
begin
if IntValue=0 then
Result := FieldName1;//字段1,就是总经理室所对应的FieldName;如部门
if IntVlaue = 1 then
Result := FieldName2;//字段2,就是经理所对应的FieldName ,如职位
end;

procedure Tthrgzzxbzhwhfrm.TreeView1Click(Sender: TObject);
var
FieldName : String;
FieldValue : String;
begin
FieldName := ResultString(TreeView1.Selected.Level);
FieldValue := TreeView1.Selected.Text;
PublicClass.OpenSQL(DataModuleFrm.bhzADOQuery,'Select * From thrgzinfwh where'
+ ' ' + FieldName + ' = ' + #39 + FieldValue + #39);
end;
ihihonline 2003-05-13
  • 打赏
  • 举报
回复
function Tthrgzzxbzhwhfrm.ResultString(IntValue : Integer): String;
begin
Case QueryComboBox.ItemIndex of
0 : Result := 'zxbzh';
1 : if IntValue = 0 then
Result := 'zw' else
Result := 'zxbzh';
2 : if IntValue = 0 then
Result := 'zc' else
Result := 'zxbzh';
end;
end;

procedure Tthrgzzxbzhwhfrm.TreeView1Click(Sender: TObject);
var
FieldName : String;
FieldValue : String;
begin
FieldName := ResultString(TreeView1.Selected.Level);
FieldValue := TreeView1.Selected.Text;
PublicClass.OpenSQL(DataModuleFrm.bhzADOQuery,'Select * From thrgzinfwh where'
+ ' ' + FieldName + ' = ' + #39 + FieldValue + #39);
end;

看一看这个是否有用?
说明:
ResultString 这个函数根据不同的选择来决定对应的字段是什么。我之前写的是这样的:一个TreeVeiw里又有三种不同的排序方式,选择不同的排序方式时,那么树就要重排,如果你激活OnClick的时候,要先判断它的排序方式,再进行查询。如上。
liufguo 2003-05-13
  • 打赏
  • 举报
回复
不知道你是否装有fastReport组件,若装了,在它的demo中有个叫report的文件夹,它的实例程序可以很好的满足你的要求,
其中的关键代码如下:
procedure TForm1.Tree1Change(Sender: TObject; Node: TTreeNode);
var
n: Integer;
begin
n := Node.StateIndex;
if n = -1 then
begin
......
end
else if n = 15 then
begin
.....
end;
with Form2.frReport1 do
begin
LoadFromFile(WPath + IntToStr(n) + '.frf');
if Dictionary.Variables.IndexOf('Description') <> - 1 then
Memo1.Text := Dictionary.Variables['Description'] else
Memo1.Text := '';
DesignBtn.Enabled := True;
PreviewBtn.Enabled := True;
end;
end;
不过,你别忘了在每一个节点中设定一个StateIndex值,自己设定。
soaringsouth 2003-05-13
  • 打赏
  • 举报
回复
procedure TPartyOrgDM.WriteToTreeview(First:boolean;
treename: Ttreeview;Fathernode:Ttreenode;AAString:string);
var childnode:Ttreenode;
BString:string;
query:TAdoquery;
CString:string;
begin
Query:=Tadoquery.Create(owner);
query.Connection:=ADOConnectionDM.ADOConnection1;
query.LockType:=ltReadOnly;
GetInfo(ID);从数据库中取相关信箱
BString:=Adoqry.fieldbyname('A').asstring;
treename.Items.BeginUpdate;
if First then
begin
treename.Items.Clear;
Fathernode:=treename.Items.add(nil,BString); //N级的开始
end;
if DisplayNextOrg(query,AAString) then
begin
while not query.Eof do
begin
CString:=trim(query.fieldbyname('abc').asstring);
if (CString<>'17') and (CString<>'18') then
begin
BString:=query.fieldbyname('B').asstring;
childnode:=treename.Items.addchild(Fathernode,BString); //N+1级
WriteToTreeview(false,treename,childnode,cbname,AString);
end;
query.next;
end;
end;
query.Destroy;
treename.Items.EndUpdate;
end;

//注意相关字段
csdnew 2003-05-13
  • 打赏
  • 举报
回复
关注,我也想知道
leaf4646 2003-05-13
  • 打赏
  • 举报
回复
up
ddvboy 2003-05-13
  • 打赏
  • 举报
回复
动态的就比较麻烦了!
rustle 2003-05-13
  • 打赏
  • 举报
回复
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Node.Text = '总经理' then
begin
....
end;
end;
esu 2003-05-13
  • 打赏
  • 举报
回复
2楼的可以 ,加not
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if not Node.HasChildren then
begin
with adoquery do
begin
close;
sql.text:='select * from table where name='''+TreeView1.Selected.Text+'''';
open;
end;
end;
end;
xlxfjxm 2003-05-13
  • 打赏
  • 举报
回复
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Node.HasChildren then
begin
//把它的Text,再把这个Text进数据库里select出来,table或query open一下,DBGrid就显示出来了

end;
end;
seawavefj 2003-05-13
  • 打赏
  • 举报
回复
谢谢,是动态的,要如何写呢?
gwsr 2003-05-13
  • 打赏
  • 举报
回复
这个挺容易的呀,你先把树建起来,不知道你的这个是不是动态的,如果是就用循环来读
如果不是,就是当TreeNode被点中时,得到它的Text,再把这个Text进数据库里select出来,table或query open一下,DBGrid就显示出来了
soaringsouth 2003-05-13
  • 打赏
  • 举报
回复
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Node.HasChildren then
begin
//
end;
end;
yoisyois 2003-05-13
  • 打赏
  • 举报
回复
up

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧