2010-04-25 6 views
5

Я пытаюсь связать коллекцию с DataGridView. Как оказалось, пользователю невозможно редактировать что-либо в этом DataGridView, хотя EditMode установлен в EditOnKeystrokeOrF2.
Вот упрощенный код:Связывание коллекций с DataGridView в Windows Forms

public Supplies() 
{ 
    InitializeComponent(); 
    List<string> l = new <string>(); 
    l.Add("hello"); 
    this.SuppliesDataGridView.DataSource = l; 
} 

Он также не работает, когда я изменить тип коллекции для SortableBindingList, словарь или даже использовать BindingSource.

Что может быть неправильно здесь?

ответ

0

После того как вы установили свойство DataSource, вы захотите отключить метод DataBind().

this.SuppliesDataGridView.DataSource = l; 
this.SuppliesDataGridView.DataBind(); 

UPDATE:

Как вы правильно заметили в комментариях, метод DataBind() не существует для этого элемента управления.

Эта ссылка может предоставить некоторую полезную информацию: http://msdn.microsoft.com/en-us/library/fbk67b6z%28v=VS.90%29.aspx

+0

В SuppliesDataGridView такого метода нет. – Sergey

2

Попробуйте это:

public class CustomCollection { public string Value { get; set; } } 

    public Supplies() 
    { 
     InitializeComponent(); 
     List<CustomCollection> l = new List<CustomCollection> { new CustomCollection { Value = "hello" } }; 
     this.SuppliesDataGridView.DataSource = l; 
    } 
5

Для меня следующий метод работает, как ожидалось:

  • Откройте форму (UserControl и т.д.) с дизайнером
  • Добавить BindingSource в вашу форму
  • Выберите BindingSource в форму и открыть страницу свойств
  • Выберите свойство DataSource и нажмите на кнопку со стрелкой вниз
  • Нажмите на Добавить источник данных проекта
  • Выбор объекта
  • Выберите объект тип, который вы хотите обработать
    • Это должен быть тип, который будет обрабатываться вашей коллекцией, а не сам CustomCollection!
  • Показать доступные источники данных путем выбора из MenuBar данных - Показать Источники данных
  • Перетащите ItemType из DatasSources на форме
  • Перейти в код вашей формы и привязки ваш CustomCollection к BindingSource

    var cc = new CustomCollection(); 
        bindingSource1.DataSource = cc; 
    

Замечания:
DataGridView - это только последняя часть вашей цепочки, чтобы (dis) разрешить изменять, добавлять и удалять объекты из вашего списка (или CustomCollection).Существует также свойство AllowNew в источнике BindingSource, а интерфейс ICollection имеет свойство IsReadOnly, которое должно быть установлено на false, чтобы разрешить редактирование. И последнее, но не менее важное: свойства вашего класса в коллекции должны иметь общедоступный метод setter, позволяющий изменять значение.

+0

Я сделал то, что вы сделали, но когда я пытаюсь добавить новый объект в список, DataGridView не обновляется, хотя сам список верен, а также листинг DataSource для привязки возвращает правильный список. –

+0

Если вы манипулируете коллекцией (добавьте, удалите, вставьте, очистите), источник привязки должен быть проинформирован об этом изменении. Либо вы реализуете «IBindingList» и при необходимости увеличиваете событие ListChanged; вместо обычной коллекции используйте 'BindingList ' или вы вызываете' bindingSource.ResetBindings (false) ' – Oliver

Смежные вопросы