DataGridViewComboBoxColumn
允许该值为列表成员之一。
在将DataGridView
绑定到自定义类时,我无法弄清楚它可以绑定到哪个值类型。例如如果我将DataPropertyName
设置为“MyProperty”,MyClass.MyProperty
可以使用什么类型的getter / setter?
答案 0 :(得分:0)
它可以是任何类型,只要它可以从 string
转换为(具有正确的TypeConverter
。这在很大程度上取决于您如何设置DisplayMember
和ValueMember
属性。奇怪的是当你想要绑定到自定义类类型的属性并只显示该类的一些属性。在这种情况下,只设置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; }
}
}