WinForm 为 DataGridViewCell 绑定 DataGridView

先上效果图。

对外提供一个 public 的方法:

// 正常 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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android开发指南

10.多媒体

41080
来自专栏郭霖

Android瀑布流照片墙实现,体验不规则排列的美感

传统界面的布局方式总是行列分明、坐落有序的,这种布局已是司空见惯,在不知不觉中大家都已经对它产生了审美疲劳。这个时候瀑布流布局的出现,就给人带来了耳目一新的感觉...

42950
来自专栏向治洪

React Native控件之ListView

概述 ListView作为核心组件之一,主要用于高效地显示一个可以垂直滚动的变化的数据列表。经过自定义组装,我们还可以用它实现九宫格等页面效果。 在Reac...

29370
来自专栏移动开发

杂记

1.EditText自动获取焦点弹出软键盘 为了防止上述情况,可以在其父级控件中添加如下属性:

13630
来自专栏Android群英传

饿了么丝滑无缝过度搜索栏的实现

23530
来自专栏哈雷彗星撞地球

(译)快速指南:用UIViewPropertyAnimator做动画

翻译自:QUICK GUIDE: ANIMATIONS WITH UIVIEWPROPERTYANIMATOR 译者:Haley_Wong

7430
来自专栏Android机动车

Material Design整理(六)——SearchView及FlexboxLayout

14210
来自专栏Android开发小工

完全自定义样式的一句话实现RecyclerView的单选多选

今天的主题是封装RecyclerView的单选多选,现在大家应该都是用的RecyclerView开发列表数据吧。

22150
来自专栏KK的小酒馆

初识自定义控件Android应用界面开发

自定义控件是个大坑,并不能在此以偏概全阐述出它的精髓,笔记仅作为一方面的了解作用。

10010
来自专栏青蛙要fly的专栏

项目需求讨论 — 用Transition做一个漂亮的登录界面

一次在逛Github的时候,看到一个漂亮的登录界面,用的是Transition做的。我就直接贴上地址:

14220

扫码关注云+社区

领取腾讯云代金券