문제가 있습니다. 폼의 많은 수의 텍스트 상자에 대해 양식의 속성 내에있는 데이터 바인딩을 사용하고 있습니다. 나는 속성 내의 필드 값뿐만 아니라 전체 속성 (이전에 저장 한 기본값으로 재설정)을 변경하고 있습니다. BindingContext[Row]
이 CurrencyManager
PropertyManager
,하지 않고, 새로 고침 방법이없는, 데이터 소스를 바꿀 때 바운드 컨트롤을 업데이트하는 더 나은 방법
((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 클래스가 무대 뒤에서하는 일입니다.
데이터 바인딩을 제거하고 다시 적용하는 것보다 더 좋은 방법이라고 생각하는 사람이 있습니까?
을 나는 종이에 잘 보이기 때문에 왜, 아무 생각이 .. ..하지만 텍스트 상자를 업데이트하지 않습니다. 모든 것을 지우고 다시 바인딩하는 것보다 좋은 생각이지만 더 효율적입니다. – Nevyn
@Nevyn 그냥 생각하지만 텍스트 상자는'pnlBody'의 직접적인 자식입니까? –
예, 모든 바운드 컨트롤은 pnlBody 안에 있습니다. 폼 자체에는 pnlHeader와 일부 버튼과 사이드 패널도 있습니다. 그 이유는'c.Databindings.Count'를 검사하는 이유이기도합니다. 왜냐하면 텍스트 상자에는 그 옆에 레이블이있어서 정말로 신경 쓰지 않기 때문입니다. – Nevyn