- //利用RemoveAt
- for (int i = table.Rows.Count; i > 0; i--)
- {
- //删除行
- this.dataGridView1.Rows.RemoveAt(i + e.RowIndex);
- }
上面的做法是通过不断的插入与删除来实现,但这样与数据库的交互变得很频繁。更好的做法应该是插入一次,然后通过隐藏或显示行来实现我们的效果。
为此,我们还要在grid中新增两个列:
IsInsert:用来判断该行是否已经有插入子节点数据
RowCount:用来保存该行下插入的子节点数量。
在方法DataGridBing中,绑定数据时,应该再加一列:
- //是否插入
- row.Cells["IsInsert"].Value = "false";
而在增加节点的时候,我们要多做一个判断,如果IsInsert为false就插入数据,如果为true就显示数据
展开行
- if (this.dataGridView1.Columns[e.ColumnIndex].Name == "EX" && isEx=="false")
- {
- if (this.dataGridView1.Rows[e.RowIndex].Cells["IsInsert"].Value.ToString() == "false")
- {
- string id = this.dataGridView1.Rows[e.RowIndex].Cells["ID"].Value.ToString();
- DataTable table = GetDataTable("select * from Department where DparentId=" + id);
- if (table.Rows.Count > 0)
- {
- //插入行
- this.dataGridView1.Rows.Insert(e.RowIndex + 1, table.Rows.Count);
- for (int i = 0; i < table.Rows.Count; i++)
- {
- DataGridViewRow row = this.dataGridView1.Rows[e.RowIndex + i + 1];
- row.DefaultCellStyle.BackColor = Color.CadetBlue;
- row.Cells["ID"].Value = table.Rows[i]["ID"];
- row.Cells["DName"].Value = table.Rows[i]["DName"];
- row.Cells["Daddress"].Value = table.Rows[i]["Daddress"];
- row.Cells["Dtelphone"].Value = table.Rows[i]["Dtelphone"];
- }
- this.dataGridView1.Rows[e.RowIndex].Cells["IsInsert"].Value = "true";
- this.dataGridView1.Rows[e.RowIndex].Cells["RowCount"].Value = table.Rows.Count;
- }
- }
- else
- {
- //显示数据
- int RowCount = Convert.ToInt32(this.dataGridView1.Rows[e.RowIndex].Cells["RowCount"].Value);
- for (int i = 1; i <= RowCount; i++)
- {
- this.dataGridView1.Rows[e.RowIndex + i].Visible = true;
- }
- }
- //将IsEx设置为true,标明该节点已经展开
- this.dataGridView1.Rows[e.RowIndex].Cells["IsEx"].Value = "true";
- this.dataGridView1.Rows[e.RowIndex].Cells["EX"].Value = "-";
- }
收