2013-02-18 2 views
2

문제가 있습니다. 폼의 많은 수의 텍스트 상자에 대해 양식의 속성 내에있는 데이터 바인딩을 사용하고 있습니다. 나는 속성 내의 필드 값뿐만 아니라 전체 속성 (이전에 저장 한 기본값으로 재설정)을 변경하고 있습니다. BindingContext[Row]CurrencyManagerPropertyManager,하지 않고, 새로 고침 방법이없는, 데이터 소스를 바꿀 때 바운드 컨트롤을 업데이트하는 더 나은 방법

((CurrencyManager)BindingContext[Row]).Refresh(); 

가 작동하지 않습니다 : 내가하고 싶었던 무엇

이런 일이었다. PushData()은 (는) 보호되어 있으며 액세스 할 수 없습니다. 나는 또한 this.Refresh()을 호출 해 보았고, 각 컨트롤마다 개별적으로 c.Refresh ...을 호출 해 보았습니다.

여기 임 현재 사용하고 코드입니다 :

private void btnReset_ButtonClicked(object sender, EventArgs e) 
{ 
    Row = ResetRow.Clone();//use clone to break the reference, dont want to be updating the ResetRow when Row fields change. 

    foreach (Control c in pnlBody.Controls) 
     if (c.DataBindings.Count > 0) 
      c.DataBindings.Clear(); 

    DataBindandSet();//re-apply all the databindings (50) 
} 

//just a sample of the databinding function itself 
private void DataBindandSet() 
{ 
    txtAzimuth.DataBindings.Add(new NullableBinding("Text", Row, "Azimuth", true)); 
    txtBHTemp.DataBindings.Add(new NullableBinding("Text", Row, "BHTemp", true)); 
    //repeat 48 more times 
} 

업데이트 내가 널 값 기본값을 설정하면 어떤 효과를 가지고 있는지 확인하기 위해 전체 데이터 바인딩 문자열로 데이터 바인딩을 설정 , 그것은 일부러.

txtAzimuth.DataBindings.Add(new NullableBinding("Text", Row, "Azimuth", true, DataSourceUpdateMode.OnPropertyChanged, "")); 

는 양식 자체의 공용 속성입니다. ResetRow은 양식의 개인 속성이며 Form Load에서 초기 행의 복제본에 할당되며 변경되지 않은 채 백업용으로 사용됩니다. 일부 속성의 값 (모두는 아님)은 null이 될 수 있으며 빈 문자열로 표시되어야합니다. 이것은 NullableBinding 클래스가 무대 뒤에서하는 일입니다.

데이터 바인딩을 제거하고 다시 적용하는 것보다 더 좋은 방법이라고 생각하는 사람이 있습니까?

답변

5

그것은 당신이에 바인딩 된 개체를 가정 바인딩 해제의 번거 로움과 리 바인딩, 을 절약 할 수 Binding.ReadValue를 사용하여 훨씬 더 나은 아니라 같은 남아 :

foreach (Control c in pnlBody.Controls) 
    foreach (Binding b in c.DataBindings) 
     b.ReadValue(); 

하면, 다른 한편으로 기본 바인딩 된 객체를 변경하면이 작업이 수행되지 않습니다. Binding과 개체 사이에 BindingSource을 넣는 것이 좋습니다. 이렇게하면 바인딩 원본을 다시 바인딩하면되고 50 개의 바인딩을 개별적으로 다시 바인딩하면됩니다. 어느 BindingSource.CancelEdit() 또는 데이터 소스를 재설정하여 호출 :

RowBindingSource.DataSource = null; 
RowBindingSource.DataSource = this.Row; 
+0

을 나는 종이에 잘 보이기 때문에 왜, 아무 생각이 .. ..하지만 텍스트 상자를 업데이트하지 않습니다. 모든 것을 지우고 다시 바인딩하는 것보다 좋은 생각이지만 더 효율적입니다. – Nevyn

+0

@Nevyn 그냥 생각하지만 텍스트 상자는'pnlBody'의 직접적인 자식입니까? –

+0

예, 모든 바운드 컨트롤은 pnlBody 안에 있습니다. 폼 자체에는 pnlHeader와 일부 버튼과 사이드 패널도 있습니다. 그 이유는'c.Databindings.Count'를 검사하는 이유이기도합니다. 왜냐하면 텍스트 상자에는 그 옆에 레이블이있어서 정말로 신경 쓰지 않기 때문입니다. – Nevyn

0

이 하나를 시도 TableAdapter.Fill(dataTable)

내 예 : this.bankingaccountTableAdapter.Fill(this.bankDataSet.bankingaccount);

+0

모두가 항상 자신의 양식을 'DataTables'에 바인딩하기 때문입니다. 그것들은 지금까지의 역사입니다, 친구. – ProfK

관련 문제