문제

데이터베이스에 이진 필드가있어 단일 "IS XXXX?"를 사용하여 UI로 설명하기 어렵습니다. 차라리 라디오 버튼 한 쌍을 사용하고 싶습니다 (예 : "Foo Way"와 "Bar Way를 수행하십시오"). 그러나 지금 내 양식의 다른 모든 필드는 비즈니스 객체에 대한 데이터가 있습니다. 라디오 버튼 쌍을 비즈니스 객체에도 데이터에 바꾸고 싶지만 아직 좋은 방법을 찾지 못했습니다. 버튼 중 하나를 필드에 바인딩하여 버튼을 선택하면 필드가 "true"로 설정되도록하지만 다른 버튼을 선택하는 동안 첫 번째 버튼을 선택 해제합니다 (즉, 두 개의 라디오 버튼이 올바르게 페어링됩니다. ), 필드의 값은이를 반영하도록 업데이트되지 않습니다.

말할 수 있기를 원합니다

button1.DataBindings.Add(new Binding("checked", source, "useFoo"));
button2.DataBindings.Add(new Binding("checked", source, "!useFoo"));

그러나 나는 그것이 달릴 때 던질 것이라고 확신합니다. 더 쉬운 방법이 있습니까, 아니면 단일 확인란을 단어하는 방법에 더 많은 생각을해야합니까? 이 사소한 것을 처리하기 위해 추가 기능을 추가하고 싶지 않습니다 ...

ETA : 댓글 작성자는 드롭 다운 (Combobox)을 고려할 것을 제안했습니다. 나는 이것에 대해 생각했지만 비즈니스 객체의 데이터베이스/속성의 부울 필드에 어떻게 데이터를 바꾸는가? 선택한 푸른 속성에 selectedItem을 바인딩하면 항목 컬렉션은 어떻게됩니까? "true"와 "false"만 추가해야합니까, 아니면 표시된 항목 ( "foo" / "foo를 사용하지 않음")에 묶는 키 / 값 쌍 객체를 추가 할 수 있습니까? 나는 이것에 대해 문서를 찾는 데 어려움을 겪고 있습니다.


답변 : 비즈니스 객체 수정과 관련된 관련 솔루션 - 기본 아이디어는 Gurge가 게시 한 것과 매우 유사하지만 그의 응답을 읽기 전에 별도로 생각해 냈습니다. 요컨대, 나는 단순히 반환하는 별도의 속성을 추가했습니다. !useFoo. 하나의 라디오 버튼이 제대로되었습니다 source.UseFoo, 다른 하나는 묶여 있습니다 source.UseBar (새 재산의 이름). 새로운 속성에 getters and setter가 있는지 확인하는 것이 중요합니다. 그렇지 않으면 정말 이상한 행동을 취할 수 있습니다.

도움이 되었습니까?

해결책

DataSet/DataTable을 사용 하여이 작업을 수행하는 방법을 찾았습니다.

표현식으로 데이터 가능에서 계산 된 열을 만듭니다. IIF(Foo=true, false, true). 그 열을 호출하자 Bar.

Bar 부울 유형입니다. 이제 하나를 묶을 수 있습니다 RadioButton.Checked 에게 Foo 그리고 하나가 Bar.

얻기 위해 Bar 다시 전파하기 위해 점검/선택 취소 Foo 생성 된 데이터 가능한 코드로 이동 하여이 샘플의 마지막 코드를 추가해야합니다.

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public bool Bar {
    get {
        try {
            return ((bool)(this[this.tableradio.BarColumn]));
        }
        catch (global::System.InvalidCastException e) {
            throw new global::System.Data.StrongTypingException("The value for column \'Bar\' in table \'radio\' is DBNull.", e);
        }
    }
    set {
        this[this.tableradio.BarColumn] = value;
        this[this.tableradio.FooColumn] = !value;
    }
}

다른 팁

  1. 바인딩 RadioButton 그것은 부울 값과 직접 연결되어 있습니다 (즉, 값이 true).
  2. 이벤트 핸들러를 추가하십시오 CheckedChanged 이것에 대한 이벤트 RadioButton 다음과 같습니다.

    private void radioButton_CheckedChanged(object sender, EventArgs e)
    {
        foreach (Binding b in ((Control)sender).DataBindings)
            b.WriteValue();
    }
    

비즈니스 객체가 inotifyPropertyChanged를 구현하는 경우 (바인딩이 더 잘 작동하는) 다음 코드를 시각적 인터페이스에 추가 할 수 있습니다. BO 귀하의 비즈니스 대상이며 위성으로 선언됩니다 BO.Value 당신이 묶고 싶은 부울 속성입니다.

Public Property NotValue() As Boolean
    Get
        Return Not BO.Value
    End Get
    Set(ByVal value As Boolean)
        BO.Value = Not value
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NotValue"))
    End Set
End Property


Private Sub BO_PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Handles BO.PropertyChanged
    If e.PropertyName = "Value" Then
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NotValue"))
    End If
End Sub

다음 바인딩은 라디오 버튼을 연결합니다.

RBTrue.DataBindings.Add(New Binding("Checked", Me.BO, "Value", False, DataSourceUpdateMode.OnPropertyChanged))
RBFalse.DataBindings.Add(New Binding("Checked", Me, "NotValue", False, DataSourceUpdateMode.OnPropertyChanged))

시각적 인터페이스는 또한 InotifyPropertyChanged를 구현해야합니다. 이 메소드는 두 가지 방식으로 작동합니다. 인터페이스가 변경되면 원래 값이 업데이트되고 원래 값이 변경되면 인터페이스가 올바르게 업데이트됩니다.

나는 같은 문제를 발견했고 실제로 표준 데이터 바인딩에서 가능하다는 것을 알았습니다.

button1.DataBindings.Add(new Binding("checked", source, "useFoo", false, DataSourceUpdateMode.OnPropertyChanged);
// no need to databind button 2, since button1.checked 
// is set to false when button2 is checked

기본적으로, DataSourceUpdateMode 설정되었습니다 OnValidation. 그것을 설정함으로써 OnPropertyChanged, 변경은 즉시 데이터 객체로 전파됩니다.

내 비즈니스 객체가 구현됩니다 INotifyPropertyChanged;

이 솔루션을 테스트함으로써 OnPropertyChanged 클릭 할 때 이벤트가 두 번 발사되었습니다 button2. 이를 방지하기 위해 간단히 설정하십시오

button1.CausesValidation = false;
button2.CausesValidation = false;

여기에 표시된대로 :TextBox Leave는 PropertyChanged가 두 번 발사됩니다

코드로 수동으로 수행하십시오. 양식을로드하면 데이터베이스에 따라 라디오 버튼을 설정합니다. 원하는대로 "저장"버튼 스토어 스토어 스토어를 누를 때. 이 예제는 라디오를 데이터베이스의 비트 필드로 저장합니다.

        // Load radio state
        radioButton1.Checked = ((myModel)myBindingSource.DataSource).boolOption1;
        radioButton2.Checked = ((myModel)myBindingSource.DataSource).boolOption2;

-

        // Save radio state
        ((myModel)myBindingSource.DataSource).boolOption1 = radioButton1.Checked;
        ((myModel)myBindingSource.DataSource).boolOption2 = radioButton2.Checked;

라디오 버튼을 테이블에서 부울로 정의했을 때 Visual Studio 2015의 "데이터 소스"패널에서 항목을 드래그하려고했지만 다른 라디오 버튼을 선택할 때 부울이 False로 업데이트되지 않는 문제가 있습니다. 다른 텍스트 입력 필드 사이에서 점프 할 때 "원인 변환"을 False Radiobutton으로 변경할 때는 자동으로 확인되지 않았습니다.

동일한 그룹에 있는지 확인하는 한 컨트롤 중 하나만 묶어야합니다.

드롭 다운을 고려할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top