UniGUI 之UniDBGrid(05)
目录
1]DataSource设置
2]显示MEMO类型里的文字
3]显示悬浮提示
4]显示当前记录及总记录数
5]读取所有记录,及分页
6]在前面加上序号列
7]不显示标题栏
8]列排序
9]编辑 和 更新 数据
10]获得某单元格里的内容
11]标题别名
12]将某列设置为CheckBox格式
13]列标题下显示过滤编辑框,自动对列数据进行过滤
14.1]右键删除一条记录
? ? ??14.2]右键删除多条记录
15]将UniDBGrid数据另存为网页/CSV格式,导出
? ? ? 15.2用uniGUI自带控件导出为Excel的xlsx格式,只适合1534版本以上
16]自画整行和单元格
17]UniDBGrid增加按钮列
18]Argument out of range.错误
19]一行所有列的编辑RowEditor
20]隔行背景色设置StripeRows
21]不显示Title按钮
22]UniDBGrid当前列名/当前行总数/数据遍历
23]设置标题行高,表头设置
24]设置某列的左右对齐(不含标题)
25]设置某列为进度条显示
26]unigui的dbgrid点击列标题进行排序
27]遍历选中行
28_UniDBGrid 实现分页,下拉选择每页数据行数,pageSize
29unidbgrid?如何替换某个字段的显示值?比如字段值为0的时候?显示成功? 1显示不成功
30激活列头末尾的排序菜单,运用UniDBGrid列头实现排序
1] 数据源DataSource设置为DataSource1
?2]? unidbgrid1.Columns[1].DisplayMemo:=true;? //显示MEMO类型里的文字,不设置只会显示(WIDEMEMO),不显示文字内容。
?
3] unidbgrid1.Columns[1].ShowToolTip:=true;//当鼠标悬浮在某单元格上,在鼠标后面显示单元格内容;
?
??function pagingBar.beforeInit(sender, config)
{ config.displayInfo = true;}
然后 点右上角 的 Apply关闭。
?
5]读取所有记录,及是否 ?分页。 ?WebOptions.FetchAll
?
方法1:Options
??方法二:
?在UniDBGrid的ExtEvents事件下加如下代码:
sender.headerCt.insert(0,new Ext.grid.RowNumberer({text:‘‘,width:‘auto‘,align:‘center‘,menuDisabled:false}));
??
?unidbgrid1.Columns[1].Sortable:= True;
?7中的标题栏要可见
0]
?
?放一个UniHiddenPanel,在里面加入编辑控件UniEdit3之类的
a)先将 ? wideMemo类型的要匹配 UniEdit,
?unidbgrid1.Columns[0].Editor:= UniEdit3;
?b)添加 过程
?
/双击修改数据 procedure TMainForm.UniDBGrid1SetCellValue(Sender: TObject; ACol, ARow: Integer; AField: TField; var Value: Variant); begin self.UniDBGrid1.DataSource.DataSet.Edit; self.UniDBGrid1.DataSource.DataSet.FieldByName(self.UniDBGrid1.Columns.Items[Acol].FieldName).Value:=Value; self.UniDBGrid1.DataSource.DataSet.Post; end;
?双击,修改后,回车,即可。
在UniDBGrid1的OnCellClick事件里
procedure TMainForm.UniDBGrid1CellClick(Column: TUniDBGridColumn); begin if Column.FieldName = ‘info‘ then //列名 unimemo1.Text:= VarToStr(Column.Field.Value) ;//Column.Field.Valueo为单元格的内容 end;
在UniDBGrid1的OnCellContextClick事件里
procedure TMainForm.UniDBGrid1CellContextClick(Column: TUniDBGridColumn; X, Y: Integer); begin n1.Caption:= ‘删除 ‘+Column.Field.DataSet.FieldByName(‘aName‘).AsString;//单元格的内容
UniPopupMenu1.Popup(X, Y, UniDBGrid1); // 弹出 右键菜单,绑定UniDBGrid1
end;
UniDBGrid1.Columns[1].Title.Caption := ‘成语‘;
12]将某列设置为CheckBox格式
? ? ?
?左边是最终结果,右边是数据库里 的数据。
unidbgrid1.Columns[2].CheckBoxField.AutoPost:=True; //当用户点选CheckBox后,改变前端显示并根据该属性决定: //True—立即自动提交到数据集中并刷新前端显示 //False—只改变前端显示,当记录滚动时再提交数据集 unidbgrid1.Columns[2].CheckBoxField.BooleanFieldOnly:=False; //是否只针对Boolean字段, //True—只能识别Boolean字段,非Boolean字段将不能显示CheckBox //False—DisplayValues和FieldValues可以针对非Boolean字段进行处理 unidbgrid1.Columns[2].CheckBoxField.DisplayValues := ‘Day;Night‘ ; //DisplayValues存储显示文字 ,不设置 则 显示 True/False; uniDBgrid1.Columns[2].CheckBoxField.Enabled:= True; // 一定为True;False则 不显示CheckBOx unidbgrid1.Columns[2].CheckBoxField.FieldValues:=‘0;1‘; //FieldValues存储字段值, unidbgrid1.Columns[2].Alignment := taLeftJustify; //靠左 排列
?? ? ? ?a].放一个TUniHiddenPanel控件在窗体上,然后将TUniEdit等编辑控件放置在这个隐藏的Panel内;
? ? ? ?b]一定要手动右键手动添加列 ;
? ? ? ?c]设置要过滤的列的Filtering,将其Editor属性设置对应的编辑控件
FDQuery1.Open(‘select id,name,info from atb‘); UniDBGrid1.Columns[0].FieldName:=‘id‘; UniDBGrid1.Columns[1].FieldName:=‘name‘; UniDBGrid1.Columns[1].DisplayMemo := true; UniDBGrid1.Columns[1].Filtering.ChangeDelay := 900; //当用户键入字符后,延时进行过滤处理的毫秒数 UniDBGrid1.Columns[1].Filtering.Editor := UniEdit1; //编辑控件 放在hidenPanel UniDBGrid1.Columns[1].Filtering.Enabled := true; //Boolean是否允许进行过滤,一定为True; UniDBGrid1.Columns[1].Title.Caption:=‘成语‘; UniEdit1.CharEOL:=#13; //表示回车 确定 开始 这很重要 UniDBGrid1.Columns[2].FieldName:=‘info‘; UniDBGrid1.Columns[2].DisplayMemo := true; UniDBGrid1.Columns[2].Filtering.ChangeDelay := 900; UniDBGrid1.Columns[2].Filtering.Editor := UniEdit2; UniDBGrid1.Columns[2].Filtering.Enabled := true; UniDBGrid1.Columns[2].Title.Caption:=‘解释‘; UniEdit2.CharEOL:=#13;
? ? ?d]回车后的事件还得自己写。
procedure TMainForm.UniDBGrid1ColumnFilter(Sender: TUniDBGrid; const Column: TUniDBGridColumn; const Value: Variant); var aFileterSQL: string; begin aFileterSQL := ‘select * from atb where 1=1 ‘; aFileterSQL:= aFileterSQL+‘ and ‘ + UniDBGrid1.Columns[1].FieldName + ‘ like ‘‘%‘ + UniDBGrid1.Columns[1].Filtering.VarValue + ‘%‘‘‘; aFileterSQL:= aFileterSQL+‘ and ‘ + UniDBGrid1.Columns[2].FieldName + ‘ like ‘‘%‘ + UniDBGrid1.Columns[2].Filtering.VarValue + ‘%‘‘‘; FDQuery1.Open(aFileterSQL); end;
14]右键删除一条记录
? ? ? a]在MainModule的BrowserOptions.boDisableMouseRightClick设为True;// ?不显示网页自带的右键菜单,显示自定义右键菜单
? ? ? b]添加右键菜单,放一个UniPopupMenu1在窗口上,并添加菜单aPopupMenu,并添加事件
? ? c]两个设置
//菜单执行 procedure TMainForm.aaClick(Sender: TObject); begin //删除该行 MessageDlg(‘是否删除该行?‘, mtConfirmation, mbYesNo, procedure(Sender: TComponent; Res: Integer) begin Case Res of mrYes: // 点Yes后执行的语句 begin unidbgrid1.DataSource.DataSet.Delete; end; mrNo: // 点No后执行的语句 begin caption := ‘mrNo‘ end; end; end); end; //c]将uniDBGrid的右键事件绑定右键菜单事件。 procedure TMainForm.UniDBGrid1CellContextClick(Column: TUniDBGridColumn; X, Y: Integer); begin n1.Caption:= ‘删除 ‘+Column.Field.DataSet.FieldByName(‘aName‘).AsString; UniPopupMenu1.Popup(X, Y, UniDBGrid1); end;
? ? a]将这四项 勾选 ?dgRowSelect ? dgCheckSelect dgMultiSelect dgDontShowSelected
? ? b]UniDBGrid1的OnCellContextClick事件
procedure TMainForm.UniDBGrid1CellContextClick(Column: TUniDBGridColumn; X, Y: Integer); begin n1.Caption:= ‘删除 ‘+ inttostr(UniDBGrid1.SelectedRows.Count) +‘ 项?‘; UniPopupMenu1.Popup(X, Y, UniDBGrid1); // 弹出 右键菜单,绑定UniDBGrid1 end;
? ? ?c] 执行 删除 多行
var aStr:string; begin aStr:= uniDBGrid6.DataSource.DataSet.FieldByname(‘Organize‘).AsString; // 如果该项已使用,不能删除 FDQuery3.Open(‘SELECT distinct 所属部门 FROM MainTable where 所属部门 = ‘‘‘+ aStr + ‘‘‘‘); if (FDQuery3.RecordCount > 0) then begin ShowMessage(aStr+‘ 已被使用中,不能删除!‘); Exit; end; UniDBGrid1.SelectedRows.Delete; // 删除多行 end;
??15]将UniDBGrid数据另存为网页/CSV格式,方便导出
procedure UniDBGridToHTML(aFDquery :TFDQuery;aHTMLFileName:string); var aHTMLtext: TstringList; j: integer; begin aHTMLtext := TstringList.Create; aHTMLtext.Add (‘<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ‘ + ‘<html> <head> <title></title> </head> ‘ + ‘ <body> <table border=".5pt solid windowtext;"; > ‘ + ‘ <col width=72 span=3 style=‘‘ width:54pt‘‘>‘); aHTMLtext.Add(‘ <tr > ‘); for j := 1 to aFDquery.FieldCount do begin aHTMLtext.Add(‘<td>‘); aHTMLtext.Add(aFDquery.Fields.FieldByNumber(j).FieldName); // 列 名 aHTMLtext.Add(‘</td>‘); end; aHTMLtext.Add(‘ </tr> ‘); aFDquery.First; while not(aFDquery.Eof) do begin aHTMLtext.Add(‘ <tr > ‘); for j := 1 to aFDquery.FieldCount do begin aHTMLtext.Add(‘<td>‘); aHTMLtext.Add(aFDquery.Fields.FieldByNumber(j).AsString); // 列 值 aHTMLtext.Add(‘</td>‘); end; aHTMLtext.Add(‘ </tr> ‘); aFDquery.Next; end; aHTMLtext.Add(‘</table> </body> </html> ‘); aHTMLtext.SaveToFile(aHTMLFileName); aHTMLtext.Free; end; procedure UniDBGridToCSV(aFDquery :TFDQuery;aCSVFileName:string);//CSV格式 var aHTMLtext: TstringList; i, j: integer; tempStr:string; begin aHTMLtext := TstringList.Create; tempStr := ‘‘; for j := aFDquery.FieldCount downto 1 do tempStr := aFDquery.Fields.FieldByNumber(j).FieldName + ‘,‘ + tempStr; tempStr := copy(tempStr, 0, Length(tempStr) - 1); //去掉最后一个 , aHTMLtext.Add(tempStr); aFDquery.First; while not(aFDquery.Eof) do begin tempStr := ‘‘; for j := aFDquery.FieldCount downto 1 do tempStr := aFDquery.Fields.FieldByNumber(j).AsString + ‘,‘ + tempStr; tempStr := copy(tempStr, 0, Length(tempStr) - 1); //去掉最后一个 , aHTMLtext.Add(tempStr); aFDquery.Next; end; aHTMLtext.SaveToFile(aCSVFileName); aHTMLtext.Free; end; procedure TMainForm.UniButton1Click(Sender: TObject); begin UniDBGridToHTML(FDquery1,‘aa.html‘); UniSession.SendFile(‘aa.html‘ //服务器端 文件名 ,‘anew.html‘ //客户端 新下载 的文件名 ); ///////////////////////////////////////////////// UniDBGridToCSV(FDquery1,‘ae.csv‘); UniSession.SendFile(‘ae.csv‘ //服务器端 文件名 ,‘MySearch.csv‘ //客户端 新下载 的文件名 ); end;
15.2用uniGUI自带控件导出为Excel的xlsx格式,只适合1534版本以上
1】添加一个UniGridExcelExporter1控件到界面 上,可以设置它的一些属性
?
2】绑定UniDBGrid1的Exporter属性为1】中UniGridExcelExporter1,并在此设置Excel文件的一些属性
?
3】导出事件,UniButton1的导出代码:
UniDBGrid1.Exporter.ExportGrid;
?
procedure TMainForm.UniDBGrid1DrawColumnCell(Sender: TObject; ACol, ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs); begin if ACol=0 then // 某列 begin Attribs.Color:=$E0E0E0; Attribs.Font.Style:=[fsBold]; end; if ARow=1 then //某行 begin Attribs.Color:=$ffffff; Attribs.Font.Style:=[fsItalic]; end; if Column.FieldName=‘UnitPrice‘ then begin if Column.Field.AsFloat>100 then begin Attribs.Font.Color:=clMaroon; Attribs.Font.Style:=[fsBold, fsItalic]; end; end else if Column.FieldName=‘Quantity‘ then begin if Column.Field.AsInteger<200 then begin Attribs.Font.Color:=clRed; Attribs.Font.Style:=[fsBold]; Attribs.Color:=clLtGray; end; end; end;
?
a]将UniDBGrid1的Images属性设为UniNativeImageList1,双击UniNativeImageList1,添加几个image子目录下的小图片,用做按钮图片,如下侧左图所示。
b]?点中UniQuery1将其SQL属性如上侧右图所示配置查询语句
select * from custom;//获取UniDBGrid1关联表的各个字段
c]点击UniDBGrid1控件,在开发环境左上侧Structure区域选择UniDBGrid1的Columns,右键添加所有数据列,分别设置前五列的FieldName属性(关联字段名称)、Title->Caption属性(列标题名称)和Width属性(列宽),如下图所示:再新增一按钮列
d]点中最后一列,将其FieldName设为“button”(名字随意,输入时会提示数据库链接错误,多次忽略即可),将其Title->Caption设为“操作”,将其ActionColumn->Enabled属性设置为True,将其ActionColumn->Buttons属性打开,增加三个按钮,分别点击每个TUniGridActionButton-x按钮,设置其ButtonId(按钮编号)、Hint(提示信息)、ImageIndex(关联到UniNativeImageList1的图片编号)属性,如下图所示:
?
?e]点击UniDBGrid1,在开发环境左下侧Object Inspector区域选择Events,添加OnColumnActionClick事件,简单示意点击不同按钮调用不同事件:
procedure TMainForm.UniDBGrid1ColumnActionClick(Column: TUniDBGridColumn; ButtonId: Integer); begin if ButtonId=0 then begin // 左键点击 删除图标 删除一列 UniDBGrid1.DataSource.DataSet.Delete; end; end;
官方例子D:\Program Files\FMSoft\Framework\uniGUI\Demos\Desktop\Grid - ActionColumn
Argument out of range.错误往往 是uniDBGrid有右键手动添加的固定列,删除该固定列。
uniDBGrid1.RowEditor:=Ture;
设置后,双击(可以在ClicksToEdit属性里设置)某一行,所有列的都可以编辑,最后点Confirm提交,点Cancel取消。
?uniDBGrid1.StripeRows:=True;
UniDBGrid1.Columns[0].Menu.MenuEnabled:=False;
?
22UniDBGrid当前列名/当前行总数/数据遍历/动态创建Filtering.Editor
UniDBGrid1.Columns[UniDBGrid1.CurrCol].FieldName;//当前列名
UniDBGrid1.DataSource.DataSet.Refresh;//更新数据
unidbgrid1.DataSource.DataSet.RecordCount//当前行总数。
procedure TMainForm.UniFormCreate(Sender: TObject);//动态创建Filtering.Editor
Var
THidenPanel: TUniHiddenPanel;
TEdit: TUniEdit;
begin
THidenPanel:= TUniHiddenPanel.Create(self);
THidenPanel.Parent := Self; //<--------------------
THidenPanel.Name:= ‘THiddenPanel‘;
TEdit:= TUniEdit.Create(self);
TEdit.Parent:= THidenPanel;
TEdit.Name:= ‘TEdit‘;
TEdit.EmptyText:= ‘teste‘;
if Assigned(TEdit) then
begin
UniDBGrid1.Columns[3].Filtering.Editor:= TEdit;
UniDBGrid1.Columns[3].Filtering.Enabled:= True;
end;
end;
procedure TMainForm.UniFormCreate(Sender: TObject); begin UniDBGrid1.Columns[0].Title.Caption := ‘<br/>‘ + UniDBGrid1.Columns[0].Title.Caption + ‘<br/><br/>‘; //如果要更宽,多加几个<br/> UniDBGrid1.Columns[0].Title.Caption := ‘<br/>‘ + UniDBGrid1.Columns[0].Title.Caption + ‘<br/><br/><br/>‘; end;
之前
?之后?
.x-column-header{/*表头设置*/ color:black;/*字体颜色*/ font-size:13px;/*字体大小*/ height: 50px;/*表头高度*/ border: none;/*表头框线*/ background:#C1C1C1;/*表头背景*/ } .GridLotacao .x-grid-column {/*带元素id的属性(设置栏),在unidbgrid中的layoutconfig属性中的cls子属性中加入GridLotacao名称*/ height: 50px; } .GridLotacao .x-grid-cell {/*带元素id的属性(设置单元格),在unidbgrid中的layoutconfig属性中的cls子属性中加入GridLotacao名称*/ height: 50px !important; line-height: 50px !important; }
?
UniDBGrid1.Columns[0].Alignment := taLeftJustify; // 靠左 排列TAlignment = (taLeftJustify, taRightJustify, taCenter);
注意:UniDBGrid1DrawColumnCell事件里不用调用类似
// UniDBGrid1.Columns[3].Width := 90; // UniDBGrid1.Columns[0].Alignment := taLeftJustify; // 靠左 排列 UniDBGrid1.Columns[3]类似属性,要写在FormCreate
?a]假设FDQuery1的相关数据库设置都已连好。
?b]右击UniDBGrid1的Columns,新增与FDQuery1相对应的字段,进度条字段为整数类型pro
]
c]放一个UniProgressbarWidget1,并设置Min,Max属性0,100
??
?d]关联字段
?
?e]书写数据库代码
procedure TMainForm.UniFormCreate(Sender: TObject); begin UniDBGrid1.Columns[0].Width := 90; FDQuery1.Connection := UniMainModule.FDConnection1; UniMainModule.FDConnection1.LoginPrompt := False; // 取消登录提示框 UniMainModule.FDConnection1.Open(‘DriverID=SQLite;Database=test1.Sqlite3‘); FDQuery1.Open(‘select isDone ,aName ,id,pro from ToDoListTable‘);//这里写UniDBGrid1中对应的列名 end;
还有两个参数可显示
?
?
要显示百分率,ShowPercent和ShowValue 必同时设为True
?
?
procedure DBGridSortByCol(dbGrid: TUniDBGrid; Column: TUniDBGridColumn; Direction: Boolean); var OrderStr:string; OrderPos:integer; SqlStr:string; Para:TUniParams; DescStr:string; OldSqlStr:string; begin if Direction=True then DescStr:=‘‘ else DescStr:=‘ desc‘; OldSqlStr:=(dbGrid.DataSource.DataSet as TUniQuery).SQL.Text; SqlStr:=LowerCase(OldSqlStr); Para:=(dbGrid.DataSource.DataSet as TUniQuery).Params; OrderPos:=Pos(‘ order ‘,SqlStr); if OrderPos=-1 then begin SqlStr:=SqlStr+‘ order by ‘+Column.FieldName; end else begin SqlStr:=Copy(SqlStr,0,OrderPos)+‘ order by ‘+Column.FieldName;; end; (dbGrid.DataSource.DataSet as TUniQuery).Close; (dbGrid.DataSource.DataSet as TUniQuery).SQL.Text:=SqlStr+DescStr; (dbGrid.DataSource.DataSet as TUniQuery).Params:=Para; (dbGrid.DataSource.DataSet as TUniQuery).Open; end;?
var i:integer; aStr:string; begin for i := 0 to (UniDBGrid1.SelectedRows.Count - 1) do begin UniDBGrid1.DataSource.DataSet.Bookmark := UniDBGrid1.SelectedRows[i]; aStr:=aStr+‘_‘+ UniDBGrid1.DataSource.DataSet.FieldByName(‘设备型号‘).AsString; end; MessageDlg(aStr, mtConfirmation, [mbOK],nil); end;
?
?28_UniDBGrid 实现分页,下拉选择每页数据行数,pageSize
?
?
29unidbgrid?如何替换某个字段的显示值?比如字段值为0的时候?显示成功? 1显示不成功
procedure flagGetText(Sender: TField; var Text: string; DisplayText: Boolean); procedure dbg_cmdlogDrawColumnCell(Sender: TObject; ACol, ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs);
?
procedure TUniFm_logCmd.flagGetText(Sender: TField; var Text: string; DisplayText: Boolean); begin if Sender.Asinteger = 1 then Text := ‘成功 ‘ else Text := ‘失败 ‘; end; procedure TUniFm_logCmd.dbg_cmdlogDrawColumnCell(Sender: TObject; ACol, ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs); begin if Column.FieldName = ‘Flag‘ then begin Column.Field.OnGetText := flagGetText; end ; end;
30激活列头末尾的排序菜单,运用UniDBGrid列头实现排序
?