DEV GridView巢狀
最近DEV搞的多,想把程式做得看起來專業點,所以稍微研究了一下。
本篇只記錄如何實現在列表裡面點選某一行可以開啟這一行關聯的子表內容。效果如下:
下面是實現過程:
1.設計器裡面:
在MainView下面新建一個EntryView(create a new level) 這樣這個gridControl裡面就有2個gridView了。
然後開啟你的設計器(Run Designer)
如果你只是測試,或者甲方對美醜沒要求時,對,你神馬都不需要設定了。
2.繫結資料
和正常的繫結一樣,gridControl.Datasource = DataSet.table[0];
不同的是,這個DataSet裡面要有2個表,table1和table2需要是主從表的關係(主表有個欄位是從表的外來鍵,形成關係),比如:就不比如了,有點懶。
儲存過程:
select OutStockPlan.* from T_OutStock_Plan as OutStockPlan where OutStockPlan.BillDate< @maxDate_Invo and OutStockPlan.BillDate> @minDate_Invo
select ospe.* from T_OutStock_Plan as osp
left join T_OutStock_Plan_Entry ospe on osp.OnlyID=ospe.VoucherID
where osp.BillDate< @maxDate_Invo and osp.BillDate> @minDate_Invo
一個儲存過程同時返回2個表,第一條語句返回主表的行,第二條語句返回這些主表資訊對應的子錶行。只要不嫌麻煩,你要分開執行也可以,我還是有點懶。
Access執行:
WMSDS relationDS = this._WMSAccess.Select_OutPlanAndEntry_Relation(dateS, dateE); //執行上面的儲存過程,返回一個DataSet,包含table1和table2
DataRelation dr = new DataRelation("通知分錄", new DataColumn[] { relationDS.T_OutStock_Plan.Columns["OnlyID"] }, new DataColumn[] { relationDS.T_OutStock_Plan_Entry.Columns["VoucherID"] }); //new一個表關係,繫結2個表的鍵
relationDS.Relations.Add(dr); //新增表關係到dataset
前臺繫結:
grid_VoucherPlanList.DataSource = relationDS.Tables["T_OutStock_Plan"]; //把主表當成datasource繫結給gridControl
收工。
追加:AllowOnlyOneMasterRowExpanded = True 那麼同時只能展開一行,如果是false就可以任意展開。
如果不想顯示那個通知分錄的tab,可以設定ShowDetailTabs為false。 不過為毛是展開一個tab呢?是不是意味著一個主表關聯多個子表的時候可以同時展開,我懶不試了。
再次追加:ColumnAutoWidth屬性, 當子View裡面想bestFitColumn的時候,需要把子表的ColumnAutoWidth設定為false。 但是如果主View的ColumnAutoWidth設定為True的時候,子表的設定將無效, 所以想把列寬都fit的話2個view都設定為false吧。
再再次追加:如果想隱藏子View中的某一列的話,新增主View事件,如下:
private void gridView1_MasterRowExpanded(object sender, DevExpress.XtraGrid.Views.Grid.CustomMasterRowEventArgs e)
{
DevExpress.XtraGrid.Views.Grid.GridView aView = gridView1.GetDetailView(e.RowHandle, e.RelationIndex) as DevExpress.XtraGrid.Views.Grid.GridView;
if (aView != null)
{
aView.Columns["VoucherID"].Visible = false; //aView就是子View,設定VID 列為隱藏
aView.BestFitColumns();
}
}