哪些数据类型可以绑定到DataGridViewComboBoxColumn?

时间:2015-10-02 14:25:20

标签: c# datagridview

DataGridViewComboBoxColumn允许该值为列表成员之一。

在将DataGridView绑定到自定义类时,我无法弄清楚它可以绑定到哪个值类型。例如如果我将DataPropertyName设置为“MyProperty”,MyClass.MyProperty可以使用什么类型的getter / setter?

1 个答案:

答案 0 :(得分:0)

它可以是任何类型,只要它可以从 string转换为(具有正确的TypeConverter。这在很大程度上取决于您如何设置DisplayMemberValueMember属性。奇怪的是当你想要绑定到自定义类类型的属性并只显示该类的一些属性。在这种情况下,只设置DisplayMember不起作用,你需要公开类的一些人工自我指向属性,以便将其绑定为ValueMember。我认为所有这些设计都源于过去想要显示obj.Name但绑定obj.Id的时候无论如何,这是一个显示我的意思的小样本:

using System;
using System.Linq;
using System.Windows.Forms;

namespace Samples
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var categories = Enumerable.Range(1, 10).Select(n => new Category { Name = "Category" + n }).ToList();
            var products = Enumerable.Range(1, 50).Select(n => new Product { Name = "Product" + n, Category = categories[(n - 1) % categories.Count] }).ToList();
            var form = new Form();
            var dg = new DataGridView { Dock = DockStyle.Fill, Parent = form, AutoGenerateColumns = false };
            dg.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Name" });
            var categoryColumn = new DataGridViewComboBoxColumn { DisplayStyleForCurrentCellOnly = true };
            // data part
            categoryColumn.DataPropertyName = "Category"; // bind to Product.Category property
            // list part
            categoryColumn.DisplayMember = "Name"; // bind to Category.Name property
            categoryColumn.ValueMember = "Self"; // w/o this it doesn't work
            categoryColumn.DataSource = categories;
            dg.Columns.Add(categoryColumn);
            dg.DataSource = products;
            Application.Run(form);
        }
    }
    public class Category
    {
        public string Name { get; set; }
        public Category Self { get { return this; } } 
    }
    public class Product
    {
        public string Name { get; set; }
        public Category Category { get; set; }
    }
}