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

相关推荐
WTCLLB21 小时前
Windows命令和工具名称
windows
YCOSA202521 小时前
雨晨 Windows 11 企业版 26H1 轻装版 28020.1362
windows
陈陈爱java21 小时前
Conda 常用命令行
linux·windows·conda
狮智先生21 小时前
【编程实践】Windows + PySide6 + Matplotlib 绘图时 WinError 32 的完整排查与解决方案
windows·ui·个人开发·matplotlib·交通物流
专注VB编程开发20年21 小时前
c#语法和java相差多少
java·开发语言·microsoft·c#
SmoothSailingT21 小时前
C#——Lazy<T>懒加载机制
开发语言·单例模式·c#·懒加载
czhc11400756631 天前
c# 1216
windows·microsoft·c#
JPX-NO1 天前
windows下编程IDE使用docker搭建的rust开发环境(Linux)
ide·windows·docker·rust
幸存者letp1 天前
为什么 max(words, key=len) 中需要传 key=len
服务器·开发语言·c#
SmoothSailingT1 天前
C#——Interface(接口)
开发语言·c#·接口