2010-01-18 3 views
3

Я использую привязку данных WinForms для отображения данных из базы данных, сопоставленной с Fluent NHibernate, и это отлично работает.NHibernate, WinForms и DataBinding - они хорошо играют вместе?

Например, я могу просто установить свойство DataSource DataGridView из объекта IList объекта, а voila - все данные!

Но теперь мне нужно начать добавлять и сохранять новые строки данных, и это не так хорошо. Я думал, что смогу просто включить свойство AllowUserToAddRows сетки, а новые строки будут добавлены в базовый IList в сущности, но это не сработало.

Затем, после небольшого поиска, я попытался настроить свойство DataSource на BindingList, который был заполнен из IList, но это не обновляется новыми строками.

В ходе моих поисков я также встретил несколько человек, которые сообщали о сложности с WinForms и DataBinding в целом, что заставляет меня задаться вопросом, буду ли я продолжать этот подход дальше.

Стоит ли придерживаться подхода DataBinding? Если да, может ли кто-нибудь предложить, где я ошибаюсь?

Или лучше просто обрабатывать все события DataGridView, связанные с добавлением новой строки, и писать собственный код для добавления новых объектов в свойство IList в моем объекте?

Другие предложения? (хотя я не думаю, что переход на WPF будет вариантом, независимо от того, насколько лучше может быть привязка данных)

ответ

5

Можете ли вы загрузить (или скопировать) свои nHibernate-объекты в общий список? Если это так, у меня был хороший успех с двусторонней привязкой, используя DataGridView, связанный с общим списком.

Ключевые моменты:

  • Общий список содержит список объектов, где каждый является экземпляром пользовательского класса.
  • Ваш собственный класс должен реализовывать общедоступные свойства для каждого связанного поля. Общественные поля не работали для меня.
  • Используйте BindingSource, чтобы обернуть фактический общий список.
  • BindingSOurce позволяет установить для свойства AllowNew значение true. Прямая привязка к списку почти работает, но DataGridVieww не отображает строку «Новая строка», даже если AllowUsersToAddRows = true.

Например, добавьте этот код в форму с dataGridView1:

private List<MyObject> m_data = new List<MyObject>(); 

    private BindingSource m_bs =new BindingSource(); 


    private void Form1_Load(object sender, EventArgs e) 
    { 

     m_data.Add(new MyObject(0,"One",DateTime.Now)); 
     m_data.Add(new MyObject(1, "Two", DateTime.Now)); 
     m_data.Add(new MyObject(2, "Three", DateTime.Now)); 

     m_bs.DataSource = m_data; 
     m_bs.AllowNew = true; 

     dataGridView1.DataSource = m_bs; 
     dataGridView1.AutoGenerateColumns = true; 
     dataGridView1.AllowUserToAddRows = true; 

    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     for (int i = 0; i < m_data.Count ; i++) 
     { 
      Console.WriteLine(string.Format("{0} {1} {2}", m_data[i].ID, m_data[i].Name, m_data[i].DOB));     
     } 
    } 
} 

public class MyObject 
{ 
    // Default ctor, required for adding new rows in DataGridView 
    public MyObject() 
    { 
    } 

    public MyObject(int id, string name, DateTime dob) 
    { 
     ID = id; 
     Name = name; 
     DOB = dob; 

    } 

    private int m_id; 
    public int ID 
    { 
     get 
     { 
      return m_id; 
     } 
     set 
     { 
      m_id = value; 
     } 
    } 


    private string m_name; 

    public string Name 
    { 
     get 
     { 
      return m_name; 
     } 
     set 
     { 
      m_name = value; 
     } 
    } 

    private DateTime m_dob; 

    public DateTime DOB 
    { 
     get 
     { 
      return m_dob; 
     } 
     set 
     { 
      m_dob = value; 
     } 
    } 
} 

Когда форма закрывается, содержимое связанного списка печатаются в окне вывода.

+0

Спасибо, Ash. Когда я переключился с использования BindingList на BindingSource, все работало нормально. –

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