DevExpress gridcontrol gridView主從表摺疊/展開顯示

在使用報表的時候,有不少須要主從表一塊兒顯示,從表不須要另外彈窗顯示明細,反而直接顯示在主表下方。如圖所示:
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

相關文章
相關標籤/搜索