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(); //valuestring 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(); //valuestring 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