带有comboboxColumn的DatagridView虚拟模型

时间:2008-09-20 17:15:21

标签: c# .net winforms datagridview

是否可以在datagridview中的组合框列中的不同行中包含不同的项目。这将使用虚拟模式。代码示例很棒。

1 个答案:

答案 0 :(得分:5)

我认为你要找的是here

该技术涉及处理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;
    }
}