我想再tdbgrid控件里实现内嵌combobox控件,实例:
Table Customers(CustID, CustName, Address, Mobile...)
Table Procucts(ProductID,ProductName,SupplierID, UnitPrice,)
Table Suppliers(SupplierID, CompanyName,Address, Country, Mobile...)
Table Orders(OrderID,OrderName, CustomerID,ProcuctID,OrderDate...)
我想综合成一张新表(当然是用tquery组件的sql语句)
myQuery(OrderID, OrderName, CustName, ProductName,
SupplierName,OrderDate... )
感知控件mydbgrid使用的数据源表是myQuery,我想直接再这个控件里编辑myQuery的内容,添加更新的最终结果当然是对Table Orders的内容进行更新。
当当前编辑对象是CustName, ProductName, SupplierName这些别的表里的数据
的字段的时候,可以显示出一个combobox控件,里面的items内容是从别的表里
join出来的。比如说当前编辑字段是CustName时,其items内容是Customers里
所有记录的字段CustName的值。
不知道有哪位大侠能解决这个问题,不胜感谢。
Table Customers(CustID, CustName, Address, Mobile...)
Table Procucts(ProductID,ProductName,SupplierID, UnitPrice,)
Table Suppliers(SupplierID, CompanyName,Address, Country, Mobile...)
Table Orders(OrderID,OrderName, CustomerID,ProcuctID,OrderDate...)
我想综合成一张新表(当然是用tquery组件的sql语句)
myQuery(OrderID, OrderName, CustName, ProductName,
SupplierName,OrderDate... )
感知控件mydbgrid使用的数据源表是myQuery,我想直接再这个控件里编辑myQuery的内容,添加更新的最终结果当然是对Table Orders的内容进行更新。
当当前编辑对象是CustName, ProductName, SupplierName这些别的表里的数据
的字段的时候,可以显示出一个combobox控件,里面的items内容是从别的表里
join出来的。比如说当前编辑字段是CustName时,其items内容是Customers里
所有记录的字段CustName的值。
不知道有哪位大侠能解决这个问题,不胜感谢。
---- Delphi提供了功能强大的 DBGrid组件,以方便进行数据库应用程序设计。但是如果我们仅仅利用DBGrid组件,每一个获得焦点(Grid)只是一个简单的文本编辑框,不方便用户输入数据。Delphi也提供了一些其他数据组件来方便用户输入,比如DBComboBox,DBCheckBox等组件,但这些组件却没有DBGrid功能强大。Delphi能不能象Visual Foxpro那样让DBGrid中获得焦点网格可以是其它可视数据组件以方便用户呢?其实我们可以通过在DBGrid中插入其他可视组件来实现这一点。 ---- Delphi对DBGrid处理的内部机制,就是在网格上浮动一个组件——DBEdit组件。你输入数据的网格其实是浮动DBEdit组件,其他未获得焦点地方不过是图像罢了。所以,在DBGrid中插入其他可视组件就是在网格上浮动一个可视组件。因此任何组件,包括从简单的DbCheckBox到复杂的对话框,都可以在DBGrid中插入。下面就是一个如何在DBGrid中插入DBComboBox组件的步骤,采用同样的办法可以插入其他组件。
---- 1、 在Delphi 4.0中新建一个项目。
---- 2、 分别拖动的Data Access组件板上DataSource、Table,Data Controls组件板上DBGrid,DBComboBox四个组件到Form1上。
---- 3、 设置各个组件的属性如下: rcf1对象 属性 设定植
Form1 Caption '在DBGrid中插入SpinEdit组件示例'
DataSource1 DataSet Table1
Table1 DatabaseName DBDEMOS
TableName 'teacher.DBF'
Active True
DBGrid1 DataSource DataSource1
DBComboBox1 DataField SEX
DataSource DataSource1
Visible False
Strings Items. '男'| '女' ---- 注意:我在这里用了Teacher.dbf,那是反映教职工的性别,只能是“男”或者是“女”。 ---- 4、 DrawDataCell事件是绘制单元格,当获得焦点网格所对应的字段与组合框所对应的字段一致时,移动组合框到获得焦点的网格上,并且
使组合框可视,从而达到在DBGrid指定列上显示DBComboBox的功能。设置DBGrid1的OnDrawDataCell事件如下:
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);
begin
if (gdFocused in State) then
begin
if (Field.FieldName = DBComboBox1.DataField ) then
begin
DBComboBox1.Left := Rect.Left + DBGrid1.Left;
DBComboBox1.Top := Rect.Top + DBGrid1.top;
DBComboBox1.Width := Rect.Right - Rect.Left;
DBComboBox1.Height := Rect.Bottom - Rect.Top;
DBComboBox1.Visible := True;
end;
end;
end; ---- 5、 DBGrid指定单元格未获得焦点时不显示DBComboBox,设置DBGrid1的OnColExit事件如下:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then
begin
DBComboBox1.Visible := false;
end;
end; ---- 6、 当DBGrid指定列获得焦点时DrawDataCell事件只是绘制单元格,并显示DBComboBox,但是DBComboBox并没有获得焦点,数据的输入还是在单元格上进行。在DBGrid1的KeyPress事件中调用SendMessage这个 Windows API函数将数据输入传输到DBComboBox上,从而达到在DBComboBox上进行数据输入。因此还要设置KeyPress事件如下:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if (key < > chr(9)) then
begin
if (DBGrid1.SelectedField.FieldName =DBComboBox1.DataField) then
begin
DBComboBox1.SetFocus;
SendMessage(DBComboBox1.Handle, WM_Char, word(Key), 0);
end;
end;
end;
[email protected]
jpyc提供的地址打不开
begin
If DBGrid1.SelectedField.FieldName = DBComboBox1.DataField then
begin
DBComboBox1.Visible := false;
end;
end;
begin
if (gdFocused in State) then
begin
if (Field.FieldName = ..) then
begin
ComboBox1.Left := Rect.Left + DBGrid1.Left;
ComboBox1.Top := Rect.Top + DBGrid1.top;
ComboBox1.Width := Rect.Right - Rect.Left;
ComboBox1.Height := Rect.Bottom - Rect.Top;
ComboBox1.Visible := True;
end;
end;
end; ----------------
沉沦中..........