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);
                }

            }
         
        }

预览显示效果图

 

 

 

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

 

posted @ 2013-07-09 13:16    阅读(3660)  评论(0)    收藏  举报