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

相关推荐
ceffans8 分钟前
PDF文档中文本解析
c++·windows·pdf
SummerGao.14 分钟前
Windows 快速搭建C++开发环境,安装C++、CMake、QT、Visual Studio、Setup Factory
c++·windows·qt·cmake·visual studio·setup factory
视觉人机器视觉1 小时前
机器视觉中的3D高反光工件检测
人工智能·3d·c#·视觉检测
CodeCraft Studio1 小时前
文档处理控件TX Text Control系列教程:使用 .NET C# 从 PDF 文档中提取基于模板的文本
pdf·c#·.net
一念春风2 小时前
C# 背景 透明 抗锯齿 (效果完美)
开发语言·c#
Igallta_8136222 小时前
【小游戏】C++控制台版本俄罗斯轮盘赌
c语言·开发语言·c++·windows·游戏·游戏程序
且听风吟ayan2 小时前
leetcode day19 844+977
leetcode·c#
C137的本贾尼2 小时前
解决 LeetCode 串联所有单词的子串问题
算法·leetcode·c#
wave_sky3 小时前
Visual Studio中打开多个项目
ide·windows·visual studio
donglxd4 小时前
防御黑客系列-第一集-电脑登录记录提示和登录远程推送
windows·网络安全·电脑·系统安全