ComboboxColumn이 포함된 DatagridView 가상 모델
-
01-07-2019 - |
문제
DataGridview의 콤보 상자 열 내에서 서로 다른 행에 서로 다른 항목을 가질 수 있습니까?이것은 가상 모드를 사용하는 것입니다.코드 샘플이 좋을 것입니다.
해결책
내 생각에 당신이 찾고 있는 것은 여기.
이 기술에는 DataGridView 컨트롤의 EditingControlShowing 이벤트를 처리하고 DataGridViewComboBoxEditingControl에 대한 데이터 소스를 업데이트하는 작업이 포함됩니다(아마도 해당 행에 있는 다른 열의 값을 기반으로 함).
편집하다:주요 요점을 보여주는 코드는 다음과 같습니다.
//Some types we'll need
enum Jobs
{
Programmer,
Salesman
}
enum DrinkCode
{
Coffee,
Coke,
MountainDew,
GinAndTonic
}
internal class Drink
{
public DrinkCode Code { get; set; }
public string Name { get; set; }
public bool Caffeinated { get; set; }
public bool Alcoholic { get; set; }
}
internal class Person
{
public string Name { get; set; }
public Jobs Job { get; set; }
public DrinkCode Drink { get; set; }
}
// the form class
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = FindPersons();
this.dataGridView1.DataSource = bindingSource;
DataGridViewComboBoxColumn column =
new DataGridViewComboBoxColumn()
{
column.DataPropertyName = "Drink";
column.HeaderText = "beverage";
column.DisplayMember = "Name";
column.ValueMember = "Code";
column.DataSource = BuildDrinksList();
}
dataGridView1.Columns.Add(column);
//handling this event is the nub of the solution
dataGridView1.EditingControlShowing +=
new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
}
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
//When the focus goes into the combo box cell, we can update the contents of the dropdown
//
DataGridViewComboBoxEditingControl comboBox = e.Control as DataGridViewComboBoxEditingControl;
//if you have more than one drop down this is not going to be good enough, but hey, it's an example!
if (comboBox != null)
{
BindingSource bindingSource = this.dataGridView1.DataSource as BindingSource;
Person person = bindingSource.Current as Person;
BindingList<Drink> bindingList = t his.BuildDrinksList(person);
comboBox.DataSource = bindingList;
}
}
//the rest of this is just data to make the example work
private BindingList<Drink> BuildDrinksList()
{
var drinks = new BindingList<Drink>();
drinks.Add(new Drink() { Alcoholic = false, Caffeinated = true, Code = DrinkCode.Coffee, Name = "Coffee" });
drinks.Add(new Drink() { Alcoholic = false, Caffeinated = true, Code = DrinkCode.Coke, Name = "Coke" });
drinks.Add(new Drink() { Alcoholic = false, Caffeinated = true, Code = DrinkCode.MountainDew, Name = "Mountain Dew" });
drinks.Add(new Drink() { Alcoholic = true, Caffeinated = false, Code = DrinkCode.GinAndTonic, Name = "Gin and Tonic" });
return drinks;
}
private BindingList<Drink> BuildDrinksList(Person p)
{
var drinks = new BindingList<Drink>();
if (p.Job == Jobs.Programmer)
{
drinks.Add(new Drink() { Alcoholic = false, Caffeinated = true, Code = DrinkCode.Coffee, Name = "Coffee" });
drinks.Add(new Drink() { Alcoholic = false, Caffeinated = true, Code = DrinkCode.Coke, Name = "Coke" });
drinks.Add(new Drink() { Alcoholic = false, Caffeinated = true, Code = DrinkCode.MountainDew, Name = "Mountain Dew" });
}
if (p.Job == Jobs.Salesman)
{
drinks.Add(new Drink() { Alcoholic = true, Caffeinated = false, Code = DrinkCode.GinAndTonic, Name = "Gin and Tonic" });
}
return drinks;
}
private BindingList<Person> FindPersons()
{
BindingList<Person> bindingList = new BindingList<Person>();
bindingList.Add(new Person() { Job = Jobs.Programmer, Drink = DrinkCode.Coffee, Name = "steve" });
bindingList.Add(new Person() { Job = Jobs.Salesman, Drink = DrinkCode.GinAndTonic, Name = "john" });
return bindingList;
}
}
제휴하지 않습니다 StackOverflow