Привязка объектов Entity Framework к Datagridview C # - PullRequest
32 голосов
/ 26 апреля 2011

Я пытался привязать объект Entity Framework к DataGridView, но я все время захожу в тупик и, похоже, нигде не могу найти свой ответ.

Я могу связать всю таблицу (сущность) с сеткой, и это позволит мне вносить изменения и сохранять эти изменения обратно в БД следующим образом:

    WS_Model.WS_Entities context;

    private void simpleButton1_Click(object sender, EventArgs e)
    {
        context = new WS_Entities();

        var query = from c in context.Users select c;

        var users = query.ToList();

        gridControl1.DataSource = users;
    }

    private void simpleButton2_Click(object sender, EventArgs e)
    {
        context.SaveChanges();
    }

но я не хочу видеть все столбцы таблицы в моей БД в моем представлении данных, поэтому я попытался сделать это следующим образом ...

WS_Entities context = new WS_Entities();

    private void simpleButton1_Click(object sender, EventArgs e)
    {
        var query = from c in context.Users
                    where c.UserName == "James"
                    select new { c.UserName, c.Password, c.Description };

        var results = query.ToList();

        gridControl1.DataSource = results;
    }

    private void simpleButton2_Click(object sender, EventArgs e)
    {
        context.SaveChanges();
    }

но теперь я не могу редактировать любые данные в моем DataGridView.

Я не вижу здесь дрова для деревьев - пожалуйста, кто-нибудь возражает, если мы покажем, что мы ошибаемся, или расскажем, как лучше всего связывать EF с Winforms, так как у меня истощает мозг.

Я вижу, что это связано с разделом:

select new { c.UserName, c.Password, c.Description }

Но я не знаю почему.

1 Ответ

38 голосов
/ 26 апреля 2011

Проблема со строкой:

select new { c.UserName, c.Password, c.Description }

Это то, что он создает анонимный тип , а анонимные типы являются неизменяемыми - только для чтения. Вот почему ваши изменения не отражаются ни в новом типе, ни в исходном объекте EF.

Теперь, что касается способов не показывать все столбцы объекта, к которому вы привязываете, я дал три варианта ниже.

Скрыть ненужные столбцы

Самый простой подход - установить для свойства visible значение false для столбцов, которые вы не хотите показывать.

dataGridView1.Columns[0].Visible = false;

Где значение в индексаторе коллекции Columns может быть целым числом, указывающим местоположение столбца, или строкой для имени столбца.

Пользовательский объект в EF для этой привязки данных

Вы также можете обработать это на уровне EF - создать собственный объект для вашей привязки, который EF отображает из базы данных без ненужных столбцов. Я вообще не использовал EF 4.0, но понимаю, что теперь у него есть такая возможность.

Пользовательский DTO, спроецированный с объекта EF и затем отображенный обратно

Третий вариант (и, на мой взгляд, они переходят от хорошего к плохому, но я подумал, что расскажу вам несколько подходов!), Это запрос к конкретному типу и затем отображение обратно на объект EF. Что-то вроде:

private class DataBindingProjection
{
    public string UserName { get; set; };
    public string Password { get; set; };
    public string Description { get; set; };
}

private void simpleButton1_Click(object sender, EventArgs e)
{
    context = new WS_Entities();
    var query = from c in context.Users
                where c.UserName == "James"
                select new DataBindingProjection { UserName = c.UserName, Password = c.Password, Description = c.Description };
    var users = query.ToList();
    gridControl1.DataSource = users;
}

private void simpleButton2_Click(object sender, EventArgs e) 
{
    // and here you have some code to map the properties back from the 
    // projection objects to your datacontext

    context.SaveChanges();
}

В некоторых ситуациях это тоже может быть приемлемым решением ...

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