UniGUI 之UniDBGrid(05)
目錄
1]DataSource設置
2]顯示MEMO類型里的文字
3]顯示懸浮提示
4]顯示當前記錄及總記錄數
5]讀取所有記錄,及分頁
6]在前面加上序號列
7]不顯示標題欄
8]列排序
9]編輯 和 更新 數據
10]獲得某單元格里的內容
15.2用uniGUI自帶控件導出為Excel的xlsx格式,只適合1534版本以上
19]一行所有列的編輯RowEditor
23]設置標題行高,表頭設置
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 DBGridToCSV(aFDquery: TFDQuery; aCSVFileName: string); // CSV格式
var
aCSVtext: TstringList;
i, j: integer;
tempStr: string;
begin
aCSVtext := TstringList.Create;
tempStr := ''; //第一行所有 的列名
for j := aFDquery.FieldCount downto 1 do
tempStr := aFDquery.Fields.FieldByNumber(j).FieldName + ',' + tempStr;
tempStr := Copy(tempStr, 0, Length(tempStr) - 1); // 去掉最后一個 ,
aCSVtext.Add(tempStr);
aFDquery.First; //所有 數據 導出
while not(aFDquery.Eof) do begin
tempStr := '';
for j := aFDquery.FieldCount downto 1 do begin
if ansiPos(',',aFDquery.Fields.FieldByNumber(j).AsString)>0 then
tempStr:='"'+ aFDquery.Fields.FieldByNumber(j).AsString +'"' + ',' + tempStr //如果單元格內點逗,整個單元外加雙引號
else tempStr := aFDquery.Fields.FieldByNumber(j).AsString + ',' + tempStr;
end;
tempStr := Copy(tempStr, 0, Length(tempStr) - 1); // 去掉最后一個 ,
aCSVtext.Add(tempStr);
aFDquery.Next;
end;
aCSVtext.SaveToFile(aCSVFileName);
aCSVtext.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/>';
UniTabSheet1.Caption:='<br/>' + 'asdfas' + '<br/><br/><br/>';//類似地uniPagecontol的表頭也可以這樣加寬 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列頭實現排序
這一項設成1就是單擊,設成2就是雙擊
同時,Options的dgRowSelect要設為False