dataGridView 嵌套ComboBox对单元格精准绑定数据

1,数据准备并绑定数据

复制代码
           List<P> list = new List<P>();
            for (int i = 0; i < 3; i++)
            {
                P data = new P();
                data.Idx = i + 1;
                data.Name = "名称" + i;
                list.Add(data);
            }
            dataGridView1.DataSource = list;
            dataGridView1.Refresh();

2,对单元格进行ComboBox绑定数据

复制代码
dicComSocuerType.Clear();
            Dictionary<int, string> a1= new Dictionary<int, string>();
            a1.Add(0, "一年级A");
            a1.Add(1, "一年级B");
            dicComSocuerType.Add(0, a1);
            Dictionary<int, string> a2 = new Dictionary<int, string>();
            a2.Add(0, "二年级A");
            a2.Add(1, "二年级B");
            dicComSocuerType.Add(1, a2);
            Dictionary<int, string> a3 = new Dictionary<int, string>();
            a3.Add(0, "三年级A");
            a3.Add(1, "三年级B");
            dicComSocuerType.Add(2, a3);
            if (dataGridView1.Rows.Count > 0)
            {
                foreach (KeyValuePair<int, Dictionary<int, string>> dicItem in dicComSocuerType)
                {
                    DataGridViewComboBoxCell boxCell = dataGridView1.Rows[dicItem.Key].Cells[2] as DataGridViewComboBoxCell;
                    boxCell.DataSource = null;
                    boxCell.Items.Clear();
                    boxCell.DataSource = dicItem.Value.ToList();
                    boxCell.DisplayMember = "Value";
                    boxCell.ValueMember = "Value";
                    boxCell.Value = dicItem.Value.ToList().FirstOrDefault().Value;
                }
            }

3,监听下拉修改动作并提交

复制代码
//监听这个动作发现改变后提交修改
        private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            if (this.dataGridView1.CurrentCell.ColumnIndex == 2)
            {
                if (dataGridView1.IsCurrentCellDirty)
                {
                    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }
            }
        }
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 2&& e.RowIndex>=0)
            {
                DataGridViewComboBoxCell boxCellType = dataGridView1.Rows[e.RowIndex].Cells[2] as DataGridViewComboBoxCell;
                string Key = boxCellType.Value.ToString(); //value
                string selectedValue = boxCellType.FormattedValue.ToString(); //displayVAlue
            }
        }

最后看效果

贴一下全部代码吧

复制代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form3 : Form
    {
        Dictionary<int, Dictionary<int, string>> dicComSocuerType = new Dictionary<int, Dictionary<int, string>>();
        public Form3()
        {
            InitializeComponent();
            this.dataGridView1.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { };
            List<P> list = new List<P>();
            for (int i = 0; i < 3; i++)
            {
                P data = new P();
                data.Idx = i + 1;
                data.Name = "名称" + i;
                list.Add(data);
            }
            dataGridView1.DataSource = list;
            dataGridView1.Refresh();

        }
        private void Form3_Load(object sender, EventArgs e)
        {
            dicComSocuerType.Clear();
            Dictionary<int, string> a1= new Dictionary<int, string>();
            a1.Add(0, "一年级A");
            a1.Add(1, "一年级B");
            dicComSocuerType.Add(0, a1);
            Dictionary<int, string> a2 = new Dictionary<int, string>();
            a2.Add(0, "二年级A");
            a2.Add(1, "二年级B");
            dicComSocuerType.Add(1, a2);
            Dictionary<int, string> a3 = new Dictionary<int, string>();
            a3.Add(0, "三年级A");
            a3.Add(1, "三年级B");
            dicComSocuerType.Add(2, a3);
            if (dataGridView1.Rows.Count > 0)
            {
                foreach (KeyValuePair<int, Dictionary<int, string>> dicItem in dicComSocuerType)
                {
                    DataGridViewComboBoxCell boxCell = dataGridView1.Rows[dicItem.Key].Cells[2] as DataGridViewComboBoxCell;
                    boxCell.DataSource = null;
                    boxCell.Items.Clear();
                    boxCell.DataSource = dicItem.Value.ToList();
                    boxCell.DisplayMember = "Value";
                    boxCell.ValueMember = "Value";
                    boxCell.Value = dicItem.Value.ToList().FirstOrDefault().Value;
                }
            }
        }
        //监听这个动作发现改变后提交修改
        private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
        {
            if (this.dataGridView1.CurrentCell.ColumnIndex == 2)
            {
                if (dataGridView1.IsCurrentCellDirty)
                {
                    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
                }
            }
        }
        private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 2&& e.RowIndex>=0)
            {
                DataGridViewComboBoxCell boxCellType = dataGridView1.Rows[e.RowIndex].Cells[2] as DataGridViewComboBoxCell;
                string Key = boxCellType.Value.ToString(); //value
                string selectedValue = boxCellType.FormattedValue.ToString(); //displayVAlue
            }
        }
    }
    class P
    {
        public int Idx { get; set; }
        public string Name { get; set; }
        public string Class { get; set; }
    }
}

说一下会遇到的问题

1,就是

dataGridView1.DataSource = list;

dataGridView1.Refresh();

如果也放在load事件里面不起效果

2,如果数据是一样的话是拿不到value值得,即使我valueNumber 是key dispalynumber是value

如果我两个value一样,就是key不一样,选择第二个得时候也拿不到第二个key

DataGridViewComboBoxCell boxCellType = dataGridView1.Rows[e.RowIndex].Cells[2] as DataGridViewComboBoxCell;

string Key = boxCellType.Value.ToString(); //value

string selectedValue = boxCellType.FormattedValue.ToString(); //displayVAlue

相关推荐
gihigo19988 分钟前
C# 绘制直线 圆形 矩形(工业上位机)
开发语言·c#
扬帆破浪23 分钟前
免费开源AI软件.桌面单机版,可移动的AI知识库,察元 AI桌面版:装一台到家用台式 把工作笔记本的对话历史迁过去
人工智能·windows·电脑·知识图谱
最幸伏的人36 分钟前
PyCharm无限创建Python进程故障总结
windows·python·pycharm
www.021 小时前
(二)windows下CLIProxyAPI:手动添加ChatGPT账号(个人记录)
人工智能·windows·chatgpt·算力·token·反代·cliproxyapi
如果'\'真能转义说10 小时前
OOXML 文档格式剖析:哈希、ZIP结构与识别
xml·算法·c#·哈希算法
我是唐青枫10 小时前
终于不用手搓两级缓存了!C#.NET HybridCache 详解:L1 L2、标签失效与防击穿实战
redis·缓存·c#·.net
CHANG_THE_WORLD15 小时前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
Byron Loong15 小时前
【调试】Dump 文件分析的完整流程
windows
Geoking.17 小时前
VSCode 安装 Claude Code 插件 + ccswitch 配置 DeepSeek API 完整教程(Windows 新手向)
ide·windows·vscode