Проблема со строкой:
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();
}
В некоторых ситуациях это тоже может быть приемлемым решением ...