2009-09-05 7 views
2

나는 보통 C++로 프로그램하기 때문에이 모든 DataSource/DataSet/Binding 자료로 인해 혼란 스럽습니다. 바라건대 너희들도 도울 수 있기를.TextBox와 함께 DataSource 사용하기

기본적으로 필자는 XML 기반 파일 형식 (특히 재무 데이터의 경우 OFX) 용 편집기를 작성하고 있습니다. 내 스키마에서 xsd.exe를 사용하여로드 된 파일을 좋고 평범한 오래된 클래스로 deserialize했습니다. DataGridView를 발견했습니다. DataGridView는 흥미로운 컬렉션 중 하나 (특히 트랜잭션 목록) 중 하나에 DataSource 속성을 설정할 수 있으며, 값을 짚어 보면로드 된 내용에 반영됩니다. deserialised 파일, 그럼 내가 저장에 대한 연재 수 있습니다. 그러나 TextBox (예 : 계정 번호)에 간단한 문자열 만 '매핑'하려는 경우 TextBoxes에서이 똑똑한 메서드를 사용할 수 없습니다. DataSource 멤버가없는 것 같습니다. 'Text'속성 사용 텍스트를 한 번만 설정하고 기본 객체에 대한 변경 사항을 반영하지 않으므로 절약은 먼저 컨트롤의 값을 가져와야합니다. DataGridView처럼 자동으로 사용하고 싶습니다.

나는 데이터 바인딩 손보는 시도했지만 내가 뭘 프롭퍼티 또는 DataMember를 같이 사용 할 생각이 없다, 그래서 내가 사용하는 의미있는 무슨인지 잘 모르겠어요 :

accountNumberTextBox.DataBindings.Add(new Binding("???", myDocument.accountNumber, "???"); 

나는 정말 분명한 것을 놓치고 있는가? 나는 그렇게 희망한다!

답변

4

는 당신이 놓치고있는 것은 string들 .NET에서 불변이다. 따라서, 바인딩에 대해 어떤 의미를 만들려면 string 값을 다른 것으로 캡슐화해야합니다. 데이터 바인딩 시스템 은 사용자가 값을 입력 할 때 기존 문자열을 새 문자열로 바꿉니다.

string을 캡슐화하는 다른 항목은 DataTable이거나 변경 알림이 포함 된 일반 오래된 클래스 일 수 있습니다. 이 변경 알림을 제공하는 가장 좋은 방법은 INotifyPropertyChanged 인터페이스를 구현하는 것입니다.

public class Document : INotifyPropertyChanged 
{ 
    private string _accountNumber; 

    public string AccountNumber 
    { 
     get { return _accountNumber; } 
     set 
     { 
      if (_accountNumber != value) 
      { 
       _accountNumber = value; 
       //this tells the data binding system that the value has changed, so the interface should be updated 
       OnPropertyChanged("AccountNumber"); 
      } 
     } 
    } 

    //raised whenever a property value on this object changes. The data binding system attaches to this event 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged: 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

그래서, 후크 업 바인딩 데이터가 다음과 같을 것이다 : 예를 들어

내가하지 않는 무엇

var document = ...; //get document from somewhere 
//bind the Text property on the TextBox to the AccountNumber property on the Document 
textBox1.DataBindings.Add("Text", document, "AccountNumber"); 
+0

아, 그 문제는 바인딩하려는 문자열이 포함 된 클래스가 생성된다는 것입니다. 이것을 덜 방해하는 방법이 있습니까? –

+0

@Pierre : thanks, fixed –

+1

@Ben : 변경 알림 로직을 생성하거나 데이터 개체를 래핑하고 UI에서 데이터 바인딩을 위해 변경 알림을 추가하는 클래스를 작성할 수 있습니다. –

2
accountNumberTextBox.DataBindings.Add("Text", 
             myDocumnt.Tables["your_table"], 
             "table_field"); 

예,

DataSet ds = new DataSet("DB"); 
DataTable dt = new DataTable("myTable"); 
dt.Columns.Add("Name"); 
dt.Rows.Add("PP"); 
dt.Rows.Add("QQ"); 
ds.Tables.Add(dt); 

textBox1.DataBindings.Add("Text", ds.Tables["myTable"], "Name"); 
+0

; 모든 DataSet/DataTable. DataSource로 사용할 문자열을 효과적으로 가져 왔습니다. 하나의 테이블을 가진 DataSet의 한 열에있는 한 행의 DataTable에 그 데이터를 표시해야합니까? –