我用下边代码做了一个treeview与数据库相连的小程序,但是在点击treeview的节点时老是出现‘缺少用于更新或刷新的基本表信息’的错误
不知道是怎么回事啊?下边是建立的三个数据表:
表 名 列 名 列 描 述
SCHOOL SCH_NO 学 校 编 号
SCH_NAME 学 校 名 称
CLASS CLS_NO 班 级 编 号
CLS_SCHNO 学 校 编 号
CLS_TEACHER 班 主 任 姓 名
STUDENT STU_NO 学 生 学 号
STU_NAME 学 生 姓 名
STU_BIRTHDAY 学 生 出 生 年 月
STU_ADDR 学 生 家 庭 地 址
CLS_NO 班级编号
一下是代码部分:先定义了一个全局变量:TempClassNo:string; STUTable 的Filtered 属 性 为True
procedure TForm1.FormCreate(Sender: TObject);
var
Node1,Node2,Node3:TTreeNode;
NodeText1,NodeText2:String;
TempValue:integer;
begin
with TreeView1.Items do
begin
clear;
Node1:=Add(nil,' 学 校');// 添 加 根 节 点
// 指 定 显 示 在 节 点 文 字 的 图 标
Node1.ImageIndex:=0; // 打 开 三 个 数 据 表
SCHTable.Active:=True;
CLASSTable.Active:=True;
STUTable.Active:=True; with SCHTable do
begin
First;
while not eof do
begin
// 获 得 学 校 的 名 称
NodeText1:=Fields[1].AsString;
// 获 得 学 校 的 编 号
TempValue:=Fields[0].AsInteger;
// 插 入 一 个 学 校 节 点
Node2:=AddChild(Node1,NodeText1);
// 指 定 学 校 节 点 前 的 图 标
Node2.ImageIndex:=1; with CLASSTable do
begin
First;
while not eof do
begin
// 查 找 与 当 前 学 校 编 号 匹 配 的 班 级 记 录
if TempValue=Fields[1].AsInteger then
begin
// 获 得 班 级 编 号
NodeText2:=Fields[0].AsString;
// 插 入 一 个 班 级 节 点
Node3:=AddChild(Node2,NodeText2);
// 指 定 班 级 节 点 前 的 图 标
Node3.ImageIndex:=2;
end;
Next;
end;
end;
Next;
end;
end;
end; Treeview1.FullExpand;// 展 开 全 部 节 点
// 关 闭 学 校、 班 级 表
SCHTable.Close;
CLASSTable.Close;
end;
procedure TForm1.TreeView1MouseDown (Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
if TreeView1.Selected = nil then
Exit;
case TreeView1.Selected.Level of
0: TreeView1.Selected.SelectedIndex:=3;
1: TreeView1.Selected.SelectedIndex:=4;
2: TreeView1.Selected.SelectedIndex:=5;
end;
// 该 值 将 传 递 给 表STUTable 的OnFiltereRecord 事 件 以 筛 选 被 选 中 班 级 的 学 生
TempClassNo:=TreeView1.Selected.Text;
// 更 新 数 据 表, 激 发 表 STUTable 的OnFiltered 事 件。
STUTable.Refresh; //在运行时可能是此处出错?
end;
procedure TForm1.STUTableFilterRecord(DataSet:TDataSet;var Accept: Boolean);
begin
Accept:=(STUTable.Fields[3].AsString=TempClassNo);
end;
请高手给我个详细的解答啊,非常感谢,高分相送!!
不知道是怎么回事啊?下边是建立的三个数据表:
表 名 列 名 列 描 述
SCHOOL SCH_NO 学 校 编 号
SCH_NAME 学 校 名 称
CLASS CLS_NO 班 级 编 号
CLS_SCHNO 学 校 编 号
CLS_TEACHER 班 主 任 姓 名
STUDENT STU_NO 学 生 学 号
STU_NAME 学 生 姓 名
STU_BIRTHDAY 学 生 出 生 年 月
STU_ADDR 学 生 家 庭 地 址
CLS_NO 班级编号
一下是代码部分:先定义了一个全局变量:TempClassNo:string; STUTable 的Filtered 属 性 为True
procedure TForm1.FormCreate(Sender: TObject);
var
Node1,Node2,Node3:TTreeNode;
NodeText1,NodeText2:String;
TempValue:integer;
begin
with TreeView1.Items do
begin
clear;
Node1:=Add(nil,' 学 校');// 添 加 根 节 点
// 指 定 显 示 在 节 点 文 字 的 图 标
Node1.ImageIndex:=0; // 打 开 三 个 数 据 表
SCHTable.Active:=True;
CLASSTable.Active:=True;
STUTable.Active:=True; with SCHTable do
begin
First;
while not eof do
begin
// 获 得 学 校 的 名 称
NodeText1:=Fields[1].AsString;
// 获 得 学 校 的 编 号
TempValue:=Fields[0].AsInteger;
// 插 入 一 个 学 校 节 点
Node2:=AddChild(Node1,NodeText1);
// 指 定 学 校 节 点 前 的 图 标
Node2.ImageIndex:=1; with CLASSTable do
begin
First;
while not eof do
begin
// 查 找 与 当 前 学 校 编 号 匹 配 的 班 级 记 录
if TempValue=Fields[1].AsInteger then
begin
// 获 得 班 级 编 号
NodeText2:=Fields[0].AsString;
// 插 入 一 个 班 级 节 点
Node3:=AddChild(Node2,NodeText2);
// 指 定 班 级 节 点 前 的 图 标
Node3.ImageIndex:=2;
end;
Next;
end;
end;
Next;
end;
end;
end; Treeview1.FullExpand;// 展 开 全 部 节 点
// 关 闭 学 校、 班 级 表
SCHTable.Close;
CLASSTable.Close;
end;
procedure TForm1.TreeView1MouseDown (Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
if TreeView1.Selected = nil then
Exit;
case TreeView1.Selected.Level of
0: TreeView1.Selected.SelectedIndex:=3;
1: TreeView1.Selected.SelectedIndex:=4;
2: TreeView1.Selected.SelectedIndex:=5;
end;
// 该 值 将 传 递 给 表STUTable 的OnFiltereRecord 事 件 以 筛 选 被 选 中 班 级 的 学 生
TempClassNo:=TreeView1.Selected.Text;
// 更 新 数 据 表, 激 发 表 STUTable 的OnFiltered 事 件。
STUTable.Refresh; //在运行时可能是此处出错?
end;
procedure TForm1.STUTableFilterRecord(DataSet:TDataSet;var Accept: Boolean);
begin
Accept:=(STUTable.Fields[3].AsString=TempClassNo);
end;
请高手给我个详细的解答啊,非常感谢,高分相送!!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货