在使用報表的時候,有不少須要主從表一塊兒顯示,從表不須要另外彈窗顯示明細,反而直接顯示在主表下方。如圖所示:
html
第一次作這個功能,主從表顯示,從表列隱藏,從表單元格點擊事件這三個功能點花費了不少時間,在網上參考了不少熱心分享,熱愛記錄的小夥伴的資料,總算大功告成,真的很是感恩!app
首先貼第一個功能,主從表顯示。這個顯示從表是看不到的,主要是代碼裏面用DataRelation來實現。當時寫後臺SQL的時候,爲了把主表與子表關聯起來也是花費了很多腦筋。由於這些數據是關聯而成,並無主外鍵之間的關聯。但由於有主從表的關係,關聯仍是有的。就是用ROW_NUMBER()函數添加序號列,用相關聯的字段更新這個序號列,主從表就能經過序號列關聯到一塊兒。函數
//主表
//調用存儲過程獲取數據源,sp是存儲過程參數
DataSet mainDS = Common.SqlHelper.ExecuteDataset(Common.SqlHelper.connString, CommandType.StoredProcedure, "BalanceInformation", sp);
DataTable mainDT = mainDS.Tables[0];//第一個表格,顯示主表信息
mainDT.TableName = "Main";
DataSet detailDS = new DataSet();
if(mainDT.Rows.Count > 0)
{
//子表
DataTable detailDT = mainDS.Tables[1];//第二個表格,顯示子表信息
detailDT.TableName = "Detail";
mainDS.Tables.Remove(detailDT);
mainDS.Tables.Add(detailDT);
}
//設定關係,ds.a(表).MainId(字段)=ds.b(表).MainId
DataRelation dr = new DataRelation("明細", mainDS.Tables["Main"].Columns["MainId"], mainDS.Tables["Detail"].Columns["MainId"]);this
mainDS.Relations.Add(dr); //綁定數據源 dt = mainDS.Tables["Main"]; gridControl1.DataSource = dt; 該功能的參考連接是: https://blog.csdn.net/david_520042/article/details/78549978 https://blog.csdn.net/qq_33459369/article/details/80006845
//隱藏子表(即從表)的列,獲取主表的行展開事件
private void gridView3_MasterRowExpanded(object sender, DevExpress.XtraGrid.Views.Grid.CustomMasterRowEventArgs e)
{.net
//獲取所點擊行的從表對象 DevExpress.XtraGrid.Views.Grid.GridView childView= gridView3.GetDetailView(e.RowHandle, e.RelationIndex) as DevExpress.XtraGrid.Views.Grid.GridView; if (childView != null) { childView.Columns["MainId"].Visible = false; //隱藏子表列 } } 該功能的參考連接是: https://www.cnblogs.com/super-cj/archive/2012/06/27/2565874.html
從表點擊的時候,是在主表的MasterRowExpanded事件裏操做,因爲從表是看不到的,因此在屬性窗口裏面是找不到的。只能經過代碼來實現。
代碼以下:
//隱藏子表(即從表)的列,獲取主表的行展開事件
private void gridView3_MasterRowExpanded(object sender, DevExpress.XtraGrid.Views.Grid.CustomMasterRowEventArgs e)
{code
//因爲從表的委託事件裏面須要再次獲取從表對象,因此e.RowHandle,e.RelationIndex須要有全局變量存儲傳遞。 rowHandle = e.RowHandle; relationIndex = e.RelationIndex; //獲取所點擊行的從表對象 DevExpress.XtraGrid.Views.Grid.GridView childView= gridView3.GetDetailView(e.RowHandle, e.RelationIndex) as DevExpress.XtraGrid.Views.Grid.GridView; if (childView != null) { childView.Columns["MainId"].Visible = false; //隱藏子表列 //設置從表單元格點擊的事件,當從表展開時,點擊單元格時發生 childView.RowCellClick += new DevExpress.XtraGrid.Views.Grid.RowCellClickEventHandler(this.ChildView_Click); } } //委託事件 private void ChildView_Click(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e) { //獲取主表,根據全局變量獲取到從表當前所屬的主表 DevExpress.XtraGrid.Views.Grid.GridView childView = gridView3.GetDetailView(rowHandle, relationIndex) as DevExpress.XtraGrid.Views.Grid.GridView; if (childView != null) { //獲取從表的行 DataRow dr = childView.GetDataRow(e.RowHandle); //獲取該行[發生日期]列的值 string startHappenDate = dr["發生日期"].ToString(); //獲取當前點擊的單元格的值 string count = e.CellValue.ToString(); // 獲取該列的字段名e.Column.FieldName } }
完畢!逐一擊破後發現也不是很難,折磨了我幾天的需求總算落下帷幕了。orm