0

VB.NET과 Visual Studio 2005를 사용하여 데이터 소스를 만들었습니다. 데이터 소스를 대화 상자로 드래그하고 VS는 연결된 객체 인 System.Windows.Forms.BindingSourceSystem.Windows.Forms.BindingNavigator의 멤버가있는 텍스트 상자를 만들었습니다.BindingSource/BindingNavigator : 바인딩 된 DataSource의 편집을 막는 방법?

List (myList)를 채우고 myList를 BindingSource의 DataSource로 설정하면 모든 항목이 읽기 전용이되도록 사실을 제외하고 복숭아가 작동합니다. 사용자가 텍스트 상자 중 하나에서 내용을 변경하면 변경 내용이 저장됩니다.

은 내가 BindingSource에 바인딩하는 읽기 전용 모음을 만들려고하지만 그게 문제가 해결되지 않은 : 나는 텍스트 상자를 모두 비활성화 할 수도 있겠죠

Dim detailsDlg As New dlgMyDetails 
Dim readOnlyList As New ReadOnlyCollection(Of MyObjects)(myList) 

detailsDlg.MyBindingSource.DataSource = readOnlyList 
detailsDlg.ShowDialog() 

을하지만 조금 보인다 무거운 손으로, 플러스 나는 아마 글꼴 색상을 변경하여 읽기 쉽도록하고 싶습니다.

이상적으로는 사용자가 텍스트 상자에 포커스를 설정하거나 내용을 편집 할 수 있는지 여부는 신경 쓰지 않지만 변경 사항이 지속되는 것을 원하지 않습니다. 즉 누군가가 뭔가를 편집하고 네비게이터를 사용하여 다음 레코드로 이동 한 다음 반환 한 경우 사용자가 이전에했던 것과 같았습니다.

어떤 제안이나 지침이 있습니까?

미리 감사드립니다.

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; } 
} 

ID와 이름은 다음과 같습니다

답변

2

Model-View-Control 관점에서 원하는 제약 조건은 모델 또는 컨트롤이 아니라보기입니다. 뷰는 화면에서 편집 가능한 것을 제한해야합니다.

정말로 읽기 전용 인 경우 읽기 전용 사용자 인터페이스 요소 (예 : 레이블)를 사용하지 않으시겠습니까? 이렇게하는 이유는 사용자에게 혼동을 줄이기 위해서입니다. 텍스트 상자 인 경우 데이터가 편집 가능하게되는 시점이 예상됩니다. 그렇지 않은 경우 비활성화 된 텍스트 상자를 표시하는 것이 올바른 UI 요소가 아니라 앞에서 언급 한 것처럼 레이블 일 것입니다.

+0

매우 흥미로운 아이디어! 하지만 나는이 방법으로 내 자신의 견해를 굴릴 것이라고 생각한다. 맞습니까? DataSource를 폼으로 끌어서 약 3 초 안에 DataGridView 또는 TextBox 컨트롤 모음을 가져올 수 있습니다. 라벨 세트를 만드는 것이 쉽지 않을까요? – John

+0

@John at CashCommons - 1) 직접 롤 수 있습니다. 2) DataGridView를 사용하고 편집을 사용하지 않도록 설정할 수 있습니다. 3) TextBox 컨트롤 컬렉션처럼 쉽게 Label 컨트롤 컬렉션을 만들 수 있습니다. Textbox와 Labels는 공통의 부모 객체 인 Control을 공유합니다. –

+0

지금 당장 VS 2005가 없지만 IDE에서 DGV 용으로 제공하는 끌어다 놓기 기능을 수정할 수 있습니까? 아니면 TextBoxes에서 레이블을 대신 제공 할 수 있습니까? 아마도 내가 갈 수있는 최선의 방법 일 것입니다.하지만 슬리브를 조금 올려 놓아야한다면 새로운 것을 배울 때 저를 죽이지 않을 것이라고 생각합니다. :) – John

1

대신 ReadOnlyCollection를 만드는 당신은 당신의 재산, 예에 (참) System.ComponentModel.ReadOnly를 읽기 전용 또는 속성을 추가 할 클래스 (MyObjects)의 속성을 변경할 수 있습니다 읽기 전용이 될 것입니다. 예제가 C# 인 경우 미안합니다. 희망이 도움이됩니다.

건배.

+0

대단히 감사합니다. dkartopr. 이것은 Person의 모든 인스턴스를 읽기 전용으로 강제 설정합니까? 일반적으로 이러한 객체를 읽고 쓸 수 있어야합니다. – John

+0

System.ComponentModel.ReadOnly (true)를 사용합니다. 예, Person의 모든 인스턴스에 적용됩니다. 예를 들어 Name 속성에 바인딩하는 텍스트 상자가 1 개있는 경우 텍스트 상자의 변경 내용이 Person의 현재 인스턴스에 반영되지 않습니다. 반면에 : instance.Name = "foo"하면 인스턴스 이름이 "foo"로 변경됩니다. – dkartopr

+0

오, 그래서 Person의 읽기 전용 인스턴스를 프로그래밍 방식으로 변경할 수 있습니까? 나는 그것들을 만들 수 있다고 가정하고 있었지만 값은 돌 (C++ "const"멤버와 비슷)로 설정되었습니다. (참고 : 귀하의 클래스는 get과 set을 모두 정의하므로 이해가됩니다.) – John

관련 문제