翻譯|使用教程|編輯:龔雪|2025-07-29 10:20:38.413|閱讀 94 次
概述:本教程主要為大家介紹DevExpress WinForms數(shù)據(jù)網(wǎng)格控件中的分組行API,歡迎下載最新版組件體驗(yàn)!
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
DevExpress WinForms擁有180+組件和UI庫(kù),能為Windows Forms平臺(tái)創(chuàng)建具有影響力的業(yè)務(wù)解決方案。DevExpress WinForms能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序,無(wú)論是Office風(fēng)格的界面,還是分析處理大批量的業(yè)務(wù)數(shù)據(jù),它都能輕松勝任!
本教程將使用DevExpress WinForms數(shù)據(jù)網(wǎng)格控件中的分組行API來(lái)自定義網(wǎng)格操作,將創(chuàng)建一個(gè)示例應(yīng)用程序,其中:
獲取DevExpress WinForms v25.1正式版下載
DevExpress技術(shù)交流群11:749942875 歡迎一起進(jìn)群討論
要學(xué)習(xí)識(shí)別和遍歷組行的基礎(chǔ)知識(shí),請(qǐng)從一個(gè)具有GridControl的應(yīng)用程序開始,該應(yīng)用程序已經(jīng)應(yīng)用了分組。
首先在狀態(tài)欄中顯示焦點(diǎn)行句柄,選擇網(wǎng)格視圖并處理它的事件,該事件在焦點(diǎn)在行之間移動(dòng)時(shí)引發(fā),當(dāng)前聚焦的行由事件的參數(shù)指定,一個(gè)單獨(dú)的方法用于在狀態(tài)欄中顯示信息。
C#
private void DisplayRowHandle(int rowHandle) { // Display the focused row handle. siRowHandleInfo.Caption = "Focused Row Handle: " + rowHandle.ToString(); } private void gridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { int focusedRowHandle = e.FocusedRowHandle; DisplayRowHandle(focusedRowHandle); }
運(yùn)行應(yīng)用程序。由于最上面的組行現(xiàn)在是集中的,狀態(tài)欄顯示其句柄等于-1。關(guān)注下面的組行,看看它的句柄是-2。如您所見,組行句柄是以-1開頭的負(fù)整數(shù)。請(qǐng)注意,行從上到下編號(hào),而不考慮它們的嵌套級(jí)別。
數(shù)據(jù)行句柄是以0開頭的非負(fù)整數(shù),第一個(gè)數(shù)據(jù)行的句柄是0,然后是1,依此類推。
現(xiàn)在修改網(wǎng)格的功能,以便根級(jí)組行在聚焦時(shí)自動(dòng)展開。向事件處理程序再添加一個(gè)方法調(diào)用,在該方法中,使用方法檢查焦點(diǎn)行是否為根組行。對(duì)于顯示在最高層次結(jié)構(gòu)級(jí)別的組行,該方法返回0。之后,通過(guò)調(diào)用方法展開焦點(diǎn)組行,將以下參數(shù)傳遞給此方法:聚焦行句柄,true用于展開組行,true用于在所有嵌套級(jí)別上額外展開子組行。
C#
private void ExpandFirstLevelGroupRow(int rowHandle) { // Check whether the specified row is a first-level group row. if (gridView.GetRowLevel(rowHandle) == 0) // Expand the row. gridView.SetRowExpanded(rowHandle, true, true); } private void gridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { // ... ExpandFirstLevelGroupRow(focusedRowHandle); }
運(yùn)行應(yīng)用程序,聚焦的根組行與它的嵌套組一起自動(dòng)展開。
現(xiàn)在修改操作,以便每次只展開一個(gè)根級(jí)組行。向事件處理程序添加一個(gè)方法調(diào)用 - CollapseFirstLevelGroupRows,該方法從-1開始倒數(shù),迭代所有組行,直到計(jì)數(shù)器到達(dá)無(wú)效的行句柄。使用方法將非聚焦組行與其嵌套組行一起折疊,第二個(gè)參數(shù)為false。
C#
private void CollapseFirstLevelGroupRows(int rowHandleToKeepExpanded) { // Check whether the specified row is a root group row. if (gridView.GetRowLevel(rowHandleToKeepExpanded) == 0) { // Collapse all root group rows except the specified row. int rowHandle = -1; while (gridView.IsValidRowHandle(rowHandle)) { if ((rowHandle != rowHandleToKeepExpanded) && (gridView.GetRowLevel(rowHandle) == 0)) gridView.SetRowExpanded(rowHandle, false, true); rowHandle--; } } } private void gridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { // ... CollapseFirstLevelGroupRows(focusedRowHandle); }
現(xiàn)在再次運(yùn)行應(yīng)用程序,當(dāng)根組行獲得焦點(diǎn)時(shí),該組與它的嵌套組一起自動(dòng)展開,而其他組則折疊。因此可以隨時(shí)擴(kuò)展單個(gè)根組。注意,最終用戶可以折疊聚焦組行,也有一種方法可以改變這種操作。
關(guān)閉應(yīng)用程序。聲明一個(gè)變量,該變量將存儲(chǔ)最后展開的根組行的句柄。處理視圖的 事件,該事件在組行被展開后觸發(fā)。使用前面聲明的變量保存當(dāng)前展開的根組行。之后,處理View的 事件,該事件在最終用戶試圖折疊組行時(shí)引發(fā)。要防止當(dāng)前展開的根組行被折疊,請(qǐng)將事件的參數(shù)設(shè)置為false。
C#
using DevExpress.XtraGrid.Views.Grid; //... int expandedRowHandle; private void gridView_GroupRowExpanded(object sender, DevExpress.XtraGrid.Views.Base.RowEventArgs e) { GridView view = sender as GridView; if (view == null) return; // Save the currently expanded root group row. if (view.GetRowLevel(e.RowHandle) == 0) expandedRowHandle = e.RowHandle; } private void gridView_GroupRowCollapsing(object sender, DevExpress.XtraGrid.Views.Base.RowAllowEventArgs e) { // Prevent the expanded root group row from being collapsed. if (e.RowHandle == expandedRowHandle) e.Allow = false; }
運(yùn)行應(yīng)用程序來(lái)查看結(jié)果,現(xiàn)在無(wú)法折疊聚焦的根行組,因此總是展開要給根行組,它的嵌套組行可以具有任何狀態(tài)。
現(xiàn)在回到設(shè)計(jì)時(shí),進(jìn)一步修改事件處理程序,聚焦組行或數(shù)據(jù)行時(shí)顯示當(dāng)前組的信息。
創(chuàng)建DisplayParentChildInfo函數(shù),并在事件處理程序中調(diào)用它。要確定聚焦行句柄是否引用組行,請(qǐng)使用方法,函數(shù)返回特定組行的子節(jié)點(diǎn)數(shù)。
對(duì)于集中的數(shù)據(jù)行,狀態(tài)欄應(yīng)該在所有級(jí)別上顯示其父組行的信息。使用方法向上移動(dòng)組行層次結(jié)構(gòu),在每個(gè)層次結(jié)構(gòu)級(jí)別,使用方法讀取組行中顯示的文本。
C#
private void DisplayParentChildInfo(int rowHandle) { // For a group row, display the number of its children. if (gridView.IsGroupRow(rowHandle)) siParentChildInfo.Caption = "Group child count: " + gridView.GetChildRowCount(rowHandle).ToString(); else { // For a data row, display info on parent group rows. int parentRowHandle = gridView.GetParentRowHandle(rowHandle); string caption = "Group row "; while (gridView.IsValidRowHandle(parentRowHandle)) { caption += "- " + gridView.GetGroupRowDisplayText(parentRowHandle); parentRowHandle = gridView.GetParentRowHandle(parentRowHandle); } siParentChildInfo.Caption = caption; } } private void gridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { // ... DisplayParentChildInfo(focusedRowHandle); }
運(yùn)行應(yīng)用程序并查看結(jié)果。當(dāng)您聚焦組行時(shí),狀態(tài)欄將顯示其子行的數(shù)量。如果焦點(diǎn)行是數(shù)據(jù)行,則狀態(tài)欄顯示所有級(jí)別的父組行信息。
C#
using DevExpress.XtraGrid.Views.Grid; private void DisplayRowHandle(int rowHandle) { // Display the focused row handle. siRowHandleInfo.Caption = "Focused Row Handle: " + rowHandle.ToString(); } private void ExpandFirstLevelGroupRow(int rowHandle) { // Check whether the specified row is a first-level group row. if (gridView.GetRowLevel(rowHandle) == 0) // Expand the row. gridView.SetRowExpanded(rowHandle, true, true); } private void CollapseFirstLevelGroupRows(int rowHandleToKeepExpanded) { // Check whether the specified row is a root group row. if (gridView.GetRowLevel(rowHandleToKeepExpanded) == 0) { // Collapse all root group rows except the specified row. int rowHandle = -1; while (gridView.IsValidRowHandle(rowHandle)) { if ((rowHandle != rowHandleToKeepExpanded) && (gridView.GetRowLevel(rowHandle) == 0)) gridView.SetRowExpanded(rowHandle, false, true); rowHandle--; } } } private void DisplayParentChildInfo(int rowHandle) { // For a group row, display the number of its children. if (gridView.IsGroupRow(rowHandle)) siParentChildInfo.Caption = "Group child count: " + gridView.GetChildRowCount(rowHandle).ToString(); else { // For a data row, display info on parent group rows. int parentRowHandle = gridView.GetParentRowHandle(rowHandle); string caption = "Group row "; while (gridView.IsValidRowHandle(parentRowHandle)) { caption += "- " + gridView.GetGroupRowDisplayText(parentRowHandle); parentRowHandle = gridView.GetParentRowHandle(parentRowHandle); } siParentChildInfo.Caption = caption; } } private void gridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) { int focusedRowHandle = e.FocusedRowHandle; DisplayRowHandle(focusedRowHandle); ExpandFirstLevelGroupRow(focusedRowHandle); CollapseFirstLevelGroupRows(focusedRowHandle); DisplayParentChildInfo(focusedRowHandle); } int expandedRowHandle; private void gridView_GroupRowExpanded(object sender, DevExpress.XtraGrid.Views.Base.RowEventArgs e) { GridView view = sender as GridView; if (view == null) return; // Save the currently expanded root group row. if (view.GetRowLevel(e.RowHandle) == 0) expandedRowHandle = e.RowHandle; } private void gridView_GroupRowCollapsing(object sender, DevExpress.XtraGrid.Views.Base.RowAllowEventArgs e) { // Prevent the expanded root group row from being collapsed. if (e.RowHandle == expandedRowHandle) e.Allow = false; }
慧都是?家?業(yè)數(shù)字化解決?案公司,專注于軟件、?油與?業(yè)領(lǐng)域,以深?的業(yè)務(wù)理解和?業(yè)經(jīng)驗(yàn),幫助企業(yè)實(shí)現(xiàn)智能化轉(zhuǎn)型與持續(xù)競(jìng)爭(zhēng)優(yōu)勢(shì)。
慧都科技是DevExpress的中國(guó)區(qū)的合作伙伴,DevExpress作為用戶界面領(lǐng)域的優(yōu)秀產(chǎn)品,幫助企業(yè)高效構(gòu)建權(quán)限管理、數(shù)據(jù)可視化(如網(wǎng)格/圖表/儀表盤)、跨平臺(tái)系統(tǒng)(WinForms/ASP.NET/.NET MAUI)及行業(yè)定制解決方案,加速開發(fā)并強(qiáng)化交互體驗(yàn)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:慧都網(wǎng)