Delphi表格控件DBGridEh应⽤实例3-编辑功能
3. 编辑功能
1) 多选
TDBGridEh 允许在选定的区域上进⾏选择记录,列以及矩形区域等操作:
允许多选会影响下⾯这些属性:
Options 选项中的dgMultiSelect 属性- 设置是否允许多选。
Options 选项中的dghClearSelection 属性- 设置在⽤户移到下⼀个单元时是否清除已选
记录。
Options 选项中的EdITActions属性-设置⽤户可以在已选记录上执⾏哪些操作(⽐如,拷贝,剪切,删除,粘贴,全选等)。Options 选项中的AllowedSelections 属性-设置允许选定记录的类型(⽐如,⾏,列,矩形区域等)。
Options 选项中的Selection 属性-设置⼀个当前的多选状态,已选记录,列或矩形区域以及存取它们的属
性和函数。
2) ⽂本多⾏显⽰
Column.WordWrap 为True可以使数据⾏中⽂本多⾏显⽰。如果⾏⾼>⽂本⾏,它就换⾏。
3) 显⽰备注字段
设置DrawMemoText to True来显⽰⽂本式的备注字段。.
4) 如何让dbgrideh1显⽰数据时只显⽰两位⼩数
DBGrideh1.Columns[0].DisplayFormat := '#.#0';
5) 获得当前DBGridEh表中单元格的序号
DBGridEh1.SelectedIndex
6) 怎样在dbgridEh和Edit中显⽰⾦额的千分号
1、lumns[0].DisplayFormat := ,0.00
2、2、adoquery1.fields[0].DisplayFormat := #,##0.00
3、都可以
4、在保存之前,记得把','号全部replace 掉,
5、tmpEdit.Text := StringReplace(tmpEdit.Text, ',', '', [rfReplaceAll]);
6、tmpEdit.Text := StringReplace(tmpEdit.Text, ',', '', [rfReplaceAll]);
7、在out 时调⽤函数⾃动加千分号
8、tmpEdit.Text := FloatFormat(tmpEdit.Text);
9、输出整型的
10、function TTblRecordEditFrame.IntFormat(intValue: string): string;
11、begin
12、//
13、if intValue = '' then
14、Result := ''
15、else
17、intValue := StringReplace(intValue, ',', '', [rfReplaceAll]);
18、intValue := StringReplace(intValue, ',', '', [rfReplaceAll]);
19、Result := formatfloat('#,###,##0', StrToFloat(intValue));
20、end;
21、end;
22、//格式化浮点数,加千分号,删除后边的0
23、function TTblRecordEditFrame.FloatFormat(floatValue: string): string;
24、var
25、decPart, intPart: string;
26、i, j: Integer;
27、numFormat: string;
28、begin
29、//
30、if floatValue = '' then
31、Result := ''
32、else
33、begin
34、floatValue := StringReplace(floatValue, ',', '', [rfReplaceAll]);
35、floatValue := StringReplace(floatValue, ',', '', [rfReplaceAll]);
36、i := pos('.', floatValue);
37、if i > 0 then //有⼩数点
38、begin
39、intPart := Copy(floatValue, 1, i - 1);
40、decPart := copy(floatValue, i + 1, Length(floatValue));
41、//从后边开始清除0
42、for j := Length(decPart) downto 1 do
43、begin
44、if decPart[j] = '0'
45、then Delete(decPart, j, 1)
46、else
47、Break;
48、end;
49、end
50、else //⽆⼩数点
52、intPart := floatValue;
53、decPart := '';
54、end;
55、if decPart <> '' then
56、numformat := '#,###,##0.' + StringOfChar('0', Length(decPart))
57、else
58、numFormat := '#,###,##0';
59、Result := formatfloat(numFormat, StrToFloat(intPart + '.' + decpart));
60、end;
7) 请问怎么才能使DBGridEh不滚动就能提交数据?
可以在关闭窗⼝时,判断⼀下数据集状态,然后⾃动保存。
if dataset.state in [dsEdit, dsInsert] then
dataset.post;
我⼀般在保存前⽤下⾯这两句,省了很多⿇烦:
if not DataSet.Active then Exit ;//(或者ShowMessage ⼀下)
if DataSet.State<> dsBrowse then DataSet.post ;
8) 我怎么把dbgrid ⾥的数据⼀次插⼊到数据库呢
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
adoquery1.First;
for i:=0 to adoquery1.RecordCount do
begin
adoquery2.Append;
adoquery2.Fields[0].Text:=dbgrid1.Fields[0].Text;
adoquery2.Fields[1].Text:=dbgrid1.Fields[2].Text;
adoquery2.Post;
adoquery1.Next;
end;
end;
9) 在DBGrid中可选中⾏⽽⼜可进⼊编辑状态
第⼀种OptionsDB中的edgoSyncSelection设为False
另⼀种如何在DBGrid中选中⾏,⽽⼜让它可以进⼊编辑状态?
也许你会问我这有什么⽤?呵呵,做数据库应⽤的兄弟们会深有感触,当⽤DBGrid 显
⽰的字段过多时,⽤户不得不拉动最下⾯的滚动条,去看最右边的东西,如果没有设置DBGrid->Options[dgRowSelect],那么,拉到最右边之后,很有可能看串⾏的;如果设置了DBGrid->Options[dgRowSelect],则在拉到最右边之后,不会看串⾏,但是⿏标点击其它⾏(不是当前选中⾏)时,DBGrid的视图⼀下⼦就会回到显⽰最左边的那⼀列,确实很⿇烦,
⽤户不得不⼀次⼜⼀次的拖运下⾯的滚动条。
⼀同事因这个问题⽽苦恼,⽽我⼜在CSDN 的⽂档库中看到了这篇⽂章:
《DBGrid 使⽤全书(五)》,链接:www.doczj/doc/d9*******.html
/article/51/51845.shtm,是
Delphi 版本的,核⼼代码如下:
type
TMyDBGrid=class(TDBGrid);
//////////////////////////////////
//DBGrid1.Options->dgEditing=True
//DBGrid1.Options->dgRowSelect=False
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with TMyDBGrid(Sender) do
begin
if DataLink.ActiveRecord=Row-1 then
begin
Canvas.Font.Color:=clWhite;
Canvas.Brush.Color:=$00800040;
end
else
begin
Canvas.Brush.Color:=Color;
Canvas.Font.Color:=Font.Color;
end;
DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
end;
他的解决办法是:曲线救国,取消DBGrid->Options[dgRowSelect],把当前选中⾏的背景绘制成蓝⾊,就象是被选中⼀样,想法确实很妙。我们公司使⽤C++Builder,我只好把这段代码改为C++Builder版本的,这时,我才发现这段代码的精妙之处。
我发现DataLink 属性是TCustomDBGrid中声明为protected 的,⽽在DBGrid中并未
声明它的可见性,因此,不能直接使⽤它;⽽Row属性则是在TCustomGrid中声明为
protected的,在TCustomGrid的⼦类中也未声明它的可见性,那么,这段代码为何在Delphi中运⾏的很好?
原因就在于:ObjectPascal的单元封装,在同⼀个单元中定义的类,互相之间是友员的关系,我们再来看这段代码的开头:type
TMyDBGrid = class(TDBGrid);
声明了⼀个TMyDBGrid 类,那么,当前这个窗体类就和TMyDBGird类互为友元了,那么当然当前窗体类可以直接访问TMyDBGrid的私有属性Row和DataLink了,⼀切都明了了,那么⽤C++就好实现了,核⼼代码如下:
void __fastcall TMainForm::LineSelEdit(TObject *Sender,const TRect &Rect, int
DataCol, TColumn *Column,TGridDrawState State)
{
class TMyGridBase : public TCustomGrid
{
public:
__property Row;
};
class TMyGrid : public TCustomDBGrid
{
public:
__property DataLink;
};
TMyGrid *MyGrid = (TMyGrid*)Sender;
TMyGridBase *MyGridBase = (TMyGridBase*)Sender;
TDBGrid *Grid = (TDBGrid*)Sender;
if(MyGrid->DataLink->ActiveRecord == MyGridBase->Row-1) {
Grid->Canvas->Font->Color = clWhite;
Grid->Canvas->Brush->Color = TColor(0x00800040);
} else {
Grid->Canvas->Brush->Color = Grid->Color;
Grid->Canvas->Font->Color = Grid->Font->Color;
}
Grid->DefaultDrawColumnCell(Rect,DataCol,Column,State);
}
我把它封装成⼀个函数,函数的参数与DBGrid的OnDrawDataCell的参数⼀样,使⽤它的⽅法就是取消设置DBGrid-rows函数的使用方法及实例
>Options[dgRowSelect],然后设置
DBGrid->DefaultDrawing = false,然后在这个DBGrid 的OnDrawDataCell事件中调⽤这个函数,如下:
void __fastcall TMainForm::DBGridDrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumn *Column,
TGridDrawState State)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论