Ответ 1
Проблема с линией:
select new { c.UserName, c.Password, c.Description }
Это то, что он создает анонимный тип а анонимные типы неизменяемы - это только чтение. Вот почему ваши изменения не отражаются ни в новом типе, ни в исходном объекте EF.
Теперь, что касается способов не показывать все столбцы объекта, к которому вы привязываетесь, я дал три варианта ниже.
Скрыть нежелательные столбцы
Самый простой подход - установить для свойства visible значение false для столбцов, которые вы не хотите показывать.
dataGridView1.Columns[0].Visible = false;
Если значение в индексе индекса коллекции столбцов может быть целым числом, определяющим местоположение столбца или строку для имени столбца.
Пользовательский объект в 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();
}
В определенных ситуациях, которые могут быть работоспособным решением тоже...