NHibernate, WinForms и DataBinding - хорошо ли они играют вместе? - PullRequest
3 голосов
/ 19 января 2010

Я использовал привязку данных WinForms для отображения данных из базы данных, сопоставленной с Fluent NHibernate, и это прекрасно работает.

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

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

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

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

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

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

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

1 Ответ

5 голосов
/ 19 января 2010

Можете ли вы загрузить (или скопировать) свои объекты 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;
        }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...