none
Отображение данных в dataGridView через DataSource: LINQ to SQL RRS feed

  • Вопрос

  • Здравствуйте. Изучаю LINQ to SQL. Пытаюсь отобразить в dataGridView строки таблицы из БД на SQL Server Light (который в составе Visual Studio). Использую Visual Studio Community Edition. Модель данных строится по технологии LINQ. Вот описание той таблицы, содержимое которой нужно отобразить.

      [Table(Name = "Reasons")]
        public class Reason
        {
            [Column(IsPrimaryKey = true, IsDbGenerated = true)]
            public long ReasonID = 0;
            [Column]
            public string ReasonName="";
         
        }

    Вот описание класса базы данных

    public class Passport : DataContext
        {
           
            public Table<Reason> Reasons;
           
            public Passport(string connection) : base(connection) { }

            
        }

    По нажатию кнопки на первой форме приложения открывается вторая форма (f2), на которой расположен только dataGridView1. В классе первой формы уже имеется поле connectionstring, куда записана строка соединения. Такое же поле есть и в классе второй формы.

     private void button17_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.Owner = this;
                f2.connectionstring = this.connectionstring;
                Passport db = new Passport(@f2.connectionstring);
                f2.dataGridView1.DataSource = db.Reasons;
                f2.ShowDialog();
            }

    При выполнении данного обработчика событий dataGridView появляется совершенно пустой (без строк и без данных в них)
    Хотя вот этот код (без использования DataSource) корректно отображает данные из таблицы:

     private void button17_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.Owner = this;
                f2.connectionstring = this.connectionstring;
                Passport db = new Passport(@f2.connectionstring);
              
                int counter = 0;
                f2.dataGridView1.Columns.Add("ReasonID", "Код Причины");
                f2.dataGridView1.Columns.Add("ReasonName", "Название Причины");
                foreach (Reason R in db.Reasons)
               {
                  f2.dataGridView1.Rows.Add();
                  f2.dataGridView1.Rows[counter].Cells[0].Value = R.ReasonID;
                  f2.dataGridView1.Rows[counter].Cells[1].Value = R.ReasonName;
                  counter++;
                 //}
            
                f2.ShowDialog();
            }

    Мой вопрос такой: что нужно изменить в первом обработчике события, который получает данные через DataSource, чтобы dataGridView также отображал имеющиеся данные, как и во втором случае?

    8 февраля 2016 г. 14:50

Ответы

  • Сам разобрался. Оказалось, что к полям классов, на основе которых создаются таблицы, с доступом public, нужно было добавить конструкции {get; set;}.

    Код класса Reason должен был быть примерно таким:

    [Table(Name = "Reasons")]
        public class Reason
        {
            [Column(IsPrimaryKey = true, IsDbGenerated = true)]
            public long ReasonID {get; set;}
            [Column]
            public string ReasonName {get; set;}
         
        }

    • Помечено в качестве ответа altair2012 12 февраля 2016 г. 20:05
    12 февраля 2016 г. 20:05

Все ответы

  • Попробуйте использовать BindingSource. Примерно так:

    BindingSource bs = new BindingSource();
    bs.DataSource = db.Reasons;
    dataGridView.DataSource = bs;

    8 февраля 2016 г. 16:37
  •     private void button17_Click(object sender, EventArgs e)
            {
                Form2 f2 = new Form2();
                f2.Owner = this;
                f2.connectionstring = this.connectionstring;
                Passport db = new Passport(@f2.connectionstring);

                BindingSource bs = new BindingSource();
                bs.DataSource = db.Reasons;

                f2.dataGridView1.DataSource = bs;


                f2.ShowDialog();

             }           

    К сожалению, если использовать данный код, dataGridView1 опять пустой.

                       
    8 февраля 2016 г. 17:02
  • Может быть, в параметрах конструктора BindingSource нужно что нибудь указать?
    8 февраля 2016 г. 17:07
  • Сам разобрался. Оказалось, что к полям классов, на основе которых создаются таблицы, с доступом public, нужно было добавить конструкции {get; set;}.

    Код класса Reason должен был быть примерно таким:

    [Table(Name = "Reasons")]
        public class Reason
        {
            [Column(IsPrimaryKey = true, IsDbGenerated = true)]
            public long ReasonID {get; set;}
            [Column]
            public string ReasonName {get; set;}
         
        }

    • Помечено в качестве ответа altair2012 12 февраля 2016 г. 20:05
    12 февраля 2016 г. 20:05