DataGridView 中数据绑定时 行的折叠和展开
DataGridView 中数据绑定时 行的折叠和展开
最近在一个项目中,可以要要报查询的信息,把主表编号相同的行 给折叠起来,在需要查看时,点击行标题显示出来。本人文字表达太好,还是直接上源码的。
---新增Winform 程序
设置数据原料 本例子程序根据 EmployeeID 类折叠 如果ID相同 就折叠起来
定义枚举 表示行的折叠和 显示 状态
public enum ExpandState { None, Expand, Collapse }
---绑定数据源
private void Form1_Load(object sender, EventArgs e) { string connectionString = "Data Source=.;Initial Catalog=Northwind;Integrated Security=True"; using (SqlConnection con=new SqlConnection(connectionString)) { con.Open(); string sqlCommand = "select EmployeeID,orderDate,shipvia,Freight,shipname,shipaddress from orders order by employeeid"; SqlDataAdapter adapter = new SqlDataAdapter(sqlCommand, con); DataTable dt = new DataTable(); adapter.Fill(dt); dataGridViewX1.DataSource = dt; button1_Click(null, null); con.Close(); } }
在绑定时设置那些行需要隐藏----
private void button1_Click(object sender, EventArgs e) { string temp_id = ""; for (int i = 0; i < dataGridViewX1.Rows.Count; i++) { string id = dataGridViewX1.Rows[i].Cells["Column1"].EditedFormattedValue.ToString(); if (temp_id.Equals(id)) { CurrencyManager cm = (CurrencyManager)BindingContext[dataGridViewX1.DataSource]; cm.SuspendBinding(); dataGridViewX1.Rows[i].Tag = ExpandState.None; dataGridViewX1.Rows[i].Visible = false; cm.ResumeBinding(); } else { dataGridViewX1.Rows[i].Tag = ExpandState.Expand; temp_id = id; } } }
单击行标题 RowHeader 折叠和 展开数据
int row = 0;//设置行号 private void dataGridViewX1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { row = 0; string temp_id = ""; ExpandState expandState = (ExpandState)dataGridViewX1.Rows[e.RowIndex].Tag; if (expandState == ExpandState.Expand) { for (int i = e.RowIndex; i < dataGridViewX1.Rows.Count; i++) { string id = dataGridViewX1.Rows[i].Cells["Column1"].EditedFormattedValue.ToString(); if (temp_id.Equals(id)) { CurrencyManager cm = (CurrencyManager)BindingContext[dataGridViewX1.DataSource]; cm.SuspendBinding(); dataGridViewX1.Rows[i].Visible = true; cm.ResumeBinding(); } else { temp_id = id; dataGridViewX1.Rows[e.RowIndex].Tag = ExpandState.Collapse; if (e.RowIndex != i) { break; } } } } if (expandState == ExpandState.Collapse) { for (int i = e.RowIndex; i < dataGridViewX1.Rows.Count; i++) { string id = dataGridViewX1.Rows[i].Cells["Column1"].EditedFormattedValue.ToString(); if (temp_id.Equals(id)) { CurrencyManager cm = (CurrencyManager)BindingContext[dataGridViewX1.DataSource]; cm.SuspendBinding(); dataGridViewX1.Rows[i].Visible = false; cm.ResumeBinding(); } else { temp_id = id; dataGridViewX1.Rows[e.RowIndex].Tag = ExpandState.Expand; if (e.RowIndex != i) { break; } } } } } private void dataGridViewX1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) { if (e.RowIndex >= 0) { if (((ExpandState)dataGridViewX1.Rows[e.RowIndex].Tag)==ExpandState.Expand) { Image img = img = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "Expand.png"); e.Graphics.DrawImage(img, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5, 15, 15); } else if (((ExpandState)dataGridViewX1.Rows[e.RowIndex].Tag) == ExpandState.Collapse) { Image img = img = Image.FromFile(AppDomain.CurrentDomain.BaseDirectory + "Collapse.png"); e.Graphics.DrawImage(img, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5, 15, 15); } else { row++; e.Graphics.DrawString(row.ToString(), e.InheritedRowStyle.Font, new SolidBrush(Color.CadetBlue), e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 5); } } }
预览显示效果图


本人第一次发博文 欢迎大家批评指正。

浙公网安备 33010602011771号