最近项目中应用到 在一个主Datagridview嵌套另一个子DatagridView.
效果如下:
实现的思路: 在父 Datagridview 点击的当前行的下方,显示子Datagridview.
//Step 1
private void Form_Load(object sender, EventArgs e)
{
//dgv : Master grid
//dataGridView1: Detail grid
dgv.Controls.Add(dataGridView1);
dataGridView1.Visible = false;
}
//Step 2
// text the rowheader of char '+' for each row in datagrid event: RowsAdded
private void dgv_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
dgv.Rows[e.RowIndex].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft;
dgv.Rows[e.RowIndex].HeaderCell.Value = "+";
}
//Step 3
// set the position of the detail (sub) datagridview showing
private void dgv_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
dgv.CurrentRow.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleLeft;
dgv.CurrentRow.HeaderCell.Value = Convert.ToString(dgv.CurrentRow.HeaderCell.Value).Trim() == "+" ? "-" : "+"; // switch text the rowheader of char '+' or '-'
int scrollRowIndex = dgv.FirstDisplayedScrollingRowIndex; // the first row in the top of the datagrid
if ((e.RowIndex - scrollRowIndex) > 10) // if the current row is the tenth row in the current page, set it to the top of the datagrid
{
dgv.FirstDisplayedScrollingRowIndex = e.RowIndex;
}
//set the position of the detail (sub) datagridview"
System.Drawing.Rectangle rect = dgv.GetCellDisplayRectangle(-1, e.RowIndex , false);
dataGridView1.Left = rect.Left;
dataGridView1.Top = rect.Bottom ;
dataGridView1.Width = dgv.Width ;
dataGridView1.Height = dgv.Height;
dataGridView1.Visible = Convert.ToString(dgv.CurrentRow.HeaderCell.Value).Trim() == "-" ? true : false; // show or hide the detail grid
}