前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WinForm 为 DataGridViewCell 绑定 DataGridView

WinForm 为 DataGridViewCell 绑定 DataGridView

作者头像
Venyo
发布2018-03-15 13:20:42
9980
发布2018-03-15 13:20:42
举报
文章被收录于专栏:Venyo 的专栏Venyo 的专栏

先上效果图。

对外提供一个 public 的方法:

代码语言:javascript
复制
// 正常 Type1 是 JSON 的数据集或者 BSON 的数据集
public void FillDataGridView(Type1 data, DataGridView gridView){
    // 为 gridView 添加字段
    ...
    
    // 为 gridView 添加数据
    foreach(Type2 d in data){
        if(d 是复杂的数据类型){
            // 创建子 DataGridview
            // 属性根据自己的需要设定
            DataGridView view = new DataGridView();
            view.AllowUserToAddRows = false;
            view.AllowUserToDeleteRows = false;
            view.AllowUserToOrderColumns = false;
            view.BackgroundColor = System.Drawing.Color.White;
            view.ReadOnly = true;
            view.Visible = false;
            
            // 此处递归调用,使得数据中所有的复杂数据类型都能用 DataGridview 单独显示出来
            FillDataGridView(d as Type1, view);// 或者 FillDataGridView(new Type1(d), view);
            
            // 设置当前的 cell
            DataGridViewCell cell = ...;
            // 设置子 DataGridview 的位置
            view.Parent = gridView;
            // 以下这种方法,需要单元格都是等长等宽才能有好的效果
            view.Left = gridView.Left + gridView.RowHeadersWidth + gridView.Columns[0].Width * cell.ColumnIndex;
            view.Top = gridView.Top + gridView.ColumnHeadersHeight + gridView.Rows[0].Height * cell.RowIndex;
            
            // 为当前的 DataGridview 以及子 DataGridview 设置响应事件
            // 以至于达到我们想要的效果:点击 cell 用另外一个 DataGridview 显示出该 cell 中的数据
            // 接下来有两个响应方法,在这个方法的后面,往下翻就有了
            gridView.CellClick += GridViewCellClick;
            view.CellClick += GridViewCellClick;
            view.Leave += GridViewLeave;
            
            // 最后将 cell 和子 DataGridview 绑定起来
            cell.Tag = view;
            cell.value = "点击查看";
        }
        else{
            // 向 cell 中填入数据
            ...
        }
    }
}



private void GridViewCellClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewCell cell = (sender as DataGridView).CurrentCell;
    if (cell.Tag != null && cell.Tag is DataGridView)
    {
        DataGridView view = (cell.Tag as DataGridView);
        view.Visible = true;
        // 此处让 view 获得焦点时为了给 GridViewLeave 提供方便
        // 如果此处不加 Focus 的话,就需要先点击 view 然后点击其他控件来让 view 失去焦点
        // 此时 view 才会消失,可是这样子的体验非常差
        view.Focus();
    }
}



private void GridViewLeave(object sender, EventArgs e)
{
    (sender as DataGridView).Visible = false;
}

OK.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档