2

私は典型的なキャッチ22の問題であるに違いないものを持っています。テキストボックスとチェックボックスを含む.NETWinFormコントロールがあります。両方のコントロールは、データクラスインスタンスのプロパティにバインドされたデータです。テキストボックスは価格用で、チェックボックスは価格が価格オーバーライドであることを示します。また、データクラスには、アイテムの元の価格を保持するプロパティがあります。

コントロールが次のルールを尊重するようにしたいと思います。

  • ユーザーが価格テキストボックスに値を入力すると、チェックボックスが自動的にオンになり、価格値を上書きしていることを示します。
  • チェックボックスをオフにすると、アイテムの価格が元の価格に戻ります。

ユーザーがチェックボックスをオフにすると、イベントハンドラーはチェックされた状態をテストし、アイテムの価格プロパティを元の価格値に設定します。ただし、価格値がデータバインドされている場合、バインドイベントが発生し、テキストボックスの値が更新されます。これにより、テキスト変更イベントハンドラーが発生し、チェックボックスが再度オンになります。

コントロール変更イベントをトリガーする何かを明示的に更新している条件をトラップしようとしました。ただし、これはその一部でのみ機能します。テキストボックスの変更イベントは、フォームが最初に表示されたときにデータバインディングが発生した場合など、自分で制御できない他の時間に発生します。

私は周りを検索してきましたが、探しているものを見つけるための適切な検索用語を思い付いていないだけだと思います。データバインディングは、2つのバインドされたコントロールを相互に作用させるなど、何か実用的なことをする必要があるまでは、すべて素晴らしくて気の利いたようです。何が制御イベントをトリガーしたかを区別する方法がないようです。

バインディングソースコンポーネントで利用可能なイベントも調べましたが、これ以上役立つものはないようです。バインドが完了した後に発生するイベントを処理できますが、それは問題が発生した後です。

誰か提案がありますか?

4

2 に答える 2

4

フォーム コードではなく、データ クラスでロジックを処理することをお勧めします。フォームに必要なのは、データ バインディングを設定するための数行だけです。その後、データ クラスが残りの処理を行います。

Private _dc As DataClass

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    _dc = New DataClass
    txtPrice.DataBindings.Add("text", _dc, "Price")
    chkOverride.DataBindings.Add("checked", _dc, "override")
End Sub

データクラス

Private _originalPrice As Double = 50

Private _price As Double = _originalPrice
Public Property Price() As Double
    Get
        Return _price
    End Get
    Set(ByVal value As Double)
        If (_price <> value) Then
            _price = value
            Override = _price <> _originalPrice
        End If
    End Set
End Property


Private _override As Boolean
Public Property Override() As Boolean
    Get
        Return _override
    End Get
    Set(ByVal value As Boolean)
        If _override <> value Then
            _override = value
            If Not _override Then Price = OriginalPrice
        End If
    End Set
End Property

フォームで CheckedChanged または TextChanged イベントを処理する必要はありません。

于 2008-10-15T07:07:00.287 に答える
0

CheckBox の状態をバインドする代わりに、TextBox のTextChangedイベントを処理して、CheckBox の状態を処理することを検討しましたか?

次に、現在の TextBox の値を元の値と比較して、CheckBox が true か false かを判断できます。

もう 1 つの考えは、TextBox を継承し、カスタム TextBox にプロパティを追加して、TextBox が独自の状態を処理できるようにすることです。たとえば、読み取り専用の IsOriginal プロパティを持つことができます。

現在VSをインストールしていないため、確認していません。例が必要な場合はお知らせください。

于 2008-10-15T03:00:29.130 に答える