导航
  • 主页
  • 语言基础/算法/系统设计
  • 数据库相关
  • 图形处理/多媒体
  • 网络通信/分布式开发
  • VCL组件开发及应用
  • Windows SDK/API
  • 问答

关于treeview的问题?

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

我要的是按如:总经理,就把总经理的资料调出来,用DBGRID显示,按总经理室或部门等不显示其内容,要怎么写呢?请赐教!
...全文
5 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
回复
发动态
发帖子
Delphi
创建于2007-08-02

4813

社区成员

Delphi 开发及应用
申请成为版主
社区公告
暂无公告