在使用報表的時候,有很多需要主從表一起顯示,從表不需要另外彈窗顯示明細,反而直接顯示在主表下方。如圖所示:
第一次做這個功能,主從表顯示,從表列隱藏,從表單元格點擊事件這三個功能點花費了很多時間,在網上參考了很多熱心分享,熱愛記錄的小伙伴的資料,總算大功告成,真的非常感恩!
首先貼第一個功能,主從表顯示。這個顯示從表是看不到的,主要是代碼里面用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"]);
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)
{
//獲取所點擊行的從表對象
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)
{
//由於從表的委托事件里面需要再次獲取從表對象,所以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
}
}
完畢!逐一擊破后發現也不是很難,折磨了我幾天的需求總算落下帷幕了。