BindingSource / BindingNavigator: Как предотвратить редактирование связанного DataSource?
Я создал источник данных в VB.NET и Visual Studio 2005. Я перетащил источник данных в диалоговое окно, а VS создал текстовые поля с элементами моего связанного объекта, System.Windows.Forms.BindingSource
и System.Windows.Forms.BindingNavigator
,
Я заполняю список (называемый myList), устанавливаю myList в качестве источника данных в BindingSource, и все работает замечательно, за исключением того факта, что я хочу, чтобы это было только для чтения. Если пользователь изменяет что-либо в одном из текстовых полей, он сохраняет эти изменения.
Я попытался создать коллекцию только для чтения для привязки к BindingSource, но это не решило проблему:
Dim detailsDlg As New dlgMyDetails
Dim readOnlyList As New ReadOnlyCollection(Of MyObjects)(myList)
detailsDlg.MyBindingSource.DataSource = readOnlyList
detailsDlg.ShowDialog()
Полагаю, я мог бы отключить все текстовые поля, но это выглядит немного неуклюже, плюс я, вероятно, хотел бы изменить цвет шрифта, чтобы его было легче читать.
В идеале мне, наверное, было бы все равно, могли бы пользователи устанавливать фокус на текстовые поля или даже редактировать содержимое, но я просто не хотел бы, чтобы какие-либо изменения сохранялись. То есть, если кто-то что-то отредактировал, воспользовался навигатором, чтобы перейти к следующей записи, а затем вернулся, я бы хотел, чтобы он был таким, каким он был до того, как пользователь поиграл с ним.
Любые предложения / рекомендации?
Заранее спасибо!
2 ответа
С точки зрения Model-View-Control вы хотите ограничить не модель или элемент управления, а представление. Вид должен ограничивать то, что редактируется на экране.
Если он действительно предназначен только для чтения, почему бы не использовать элемент интерфейса пользователя только для чтения, то есть метку? Причина, по которой вы делаете это, состоит в том, чтобы уменьшить путаницу с пользователем. Если это текстовое поле, разумно ожидать, что в какой-то момент данные станут редактируемыми. Если это не так, то представление отключенного текстового поля, скорее всего, не тот элемент пользовательского интерфейса, который должен быть представлен, а, как уже упоминалось, метка.
Вместо создания ReadOnlyCollection вы можете изменить свойство в своем классе (MyObjects) на ReadOnly или добавить атрибут System.ComponentModel.ReadOnly(true) к своему свойству, например:
class Person
{
public Person(int id, string name, string address)
{
_id = id;
Name = name;
Address = address;
}
private int _id = 0;
public int ID { get { return _id; } }
[System.ComponentModel.ReadOnly(true)]
public string Name { get; set; }
public string Address { get; set; }
}
Идентификатор и имя будут доступны только для чтения, извините, если пример написан на C#. Надеюсь это поможет.
Приветствия.