Modèle virtuel DatagridView avec comboboxColumn
-
01-07-2019 - |
Question
est-il possible d'avoir différents éléments dans différentes lignes d'une colonne de liste déroulante dans une vue datagrid. Ce serait en utilisant le mode virtuel. Des exemples de code seraient intéressants.
La solution
Je pense que ce que vous recherchez, c'est ici .
La technique implique la gestion de l'événement EditingControlShowing du contrôle DataGridView et la mise à jour de la source de données pour DataGridViewComboBoxEditingControl (probablement en fonction des valeurs des autres colonnes de cette ligne).
Modifier: voici un code qui montre les points principaux
//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;
}
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow