BindingSource / BindingNavigator: Как предотвратить редактирование связанного DataSource? - PullRequest
0 голосов
/ 11 февраля 2010

Я создал источник данных с помощью 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 ]

2 голосов
/ 21 февраля 2010

С точки зрения Model-View-Control вы хотите ограничить не модель или элемент управления, а представление. Вид должен ограничивать то, что редактируется на экране.

Если он действительно предназначен только для чтения, почему бы не использовать элемент интерфейса пользователя только для чтения, то есть метку? Причина, по которой вы делаете это, состоит в том, чтобы уменьшить путаницу с пользователем. Если это текстовое поле, разумно ожидать, что в какой-то момент данные станут редактируемыми. Если это не так, то представление отключенного текстового поля, скорее всего, не тот элемент пользовательского интерфейса, который требуется, а, как уже упоминалось, метка.

1 голос
/ 16 февраля 2010

Вместо создания 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 #. Надеюсь, это поможет.

Приветствие.

...