繁体   English   中英

具有comboboxColumn的DatagridView虚拟模型

[英]DatagridView virtual model with comboboxColumn

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

我认为你在寻找什么是这里

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM