2015-10-02 4 views
0

A DataGridViewComboBoxColumn позволяет значение быть одним из членов списка.Какие типы данных могут связываться с DataGridViewComboBoxColumn?

Не могу понять, какой тип значения может связываться при привязке DataGridView к пользовательскому классу. например если я установил DataPropertyName в «MyProperty», какой тип (ы) может использовать MyClass.MyProperty для геттера/сеттера?

+0

Мои тесты предполагают, что требуется просто «строка», содержащая одно из разрешенных значений, но мне интересно, может ли кто-нибудь указать мне на документацию, поддерживающую (или нет) это? –

ответ

0

Это может быть любого типа, как только это кабриолет изstring (иметь надлежащую TypeConverter. Это также в значительной степени зависит от того, как вы установили DisplayMember и ValueMember свойства. Странная вещь, когда вы хотите связать со свойством пользовательского типа класса и просто отобразить некоторое свойство этого класса. В этом случае установка только DisplayMember не работает, и вам нужно выставить некоторое искусственное свойство self pointing этого класса, чтобы связать его как 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; } 
    } 
} 
Смежные вопросы