0

C#、VS-2010、winforms

通常、バインド可能なMyPropertyを使用してユーザーコントロールを作成します。しかし、私はいくつかの問題に遭遇しました。現在の行が変更されると、データ行が変更されます。

C#プロジェクトをダウンロードして、自分で試すことができます: test_bind.zip

簡単にするために、私は次のようにしました。

  1. でテストフォームを作成する
    • dataGridView(ReadOnlyに設定)、
    • テキストボックス、
    • いくつかのテーブルを持ついくつかの型付きデータセット
    • bindingSource
  2. bindingSourceをテーブルにバインドします
  3. dgvをbindingSourceにバインドします
  4. TextBox.TextをbindingSourceにバインドしてテキスト列( "name")にバインドする
  5. いくつかのデータを含むフォームロードフィルテーブル。(手動で行を追加する場合は、AcceptChanges()を忘れないでください)
  6. テーブルxxx_ColumnChanging(...)のイベントハンドラーを追加し、そこにブレークポイントを設定します

すべての標準的な手順、特別なことは何もありません

走る

予想どおり-dgvの行、textBoxの現在の名前、グリッドの別の行をクリックします...テキストボックスのテキストを変更した場合にのみ、ブレークポイントで停止します。

プログラムを変更し、textBoxをTextではなく別のプロパティにバインドしましょう-Tagとしましょ。DataSourceUpdateProperty「OnValidation」または「OnPropertyChanged」を設定します。

走る

これで、現在の行が変更されます。!!!

textBoxの代わりにダミープロパティでUserControlを使用した場合も同じことが起こります

文字列MyProperty{セット; 得る; }

TextBox.Textと同じ動作でユーザーコントロールのカスタムプロパティをバインドするにはどうすればよいですか?

注: バインディングプロパティ自体は問題ではありません。問題は次のとおりです。標準のTextBox.Textプロパティにバインドすると-すべてOKWen他のプロパティ(タグ)またはユーザーコントロールのカスタムプロパティにバインドします-その後、データソースは常に現在の行に対して変更されます

4

1 に答える 1

2

簡単な答えは次のとおりです。

単純なプロパティにバインドする場合、次のように宣言されます

[Bindable(true, BindingDirection.TwoWay)]           //  I need TwoWay    
public String MyProp {set;get;}

その後、データソースは現在の位置の変更時に更新されます。あなたはそれをバグまたは機能として数えるかもしれません...

行動を変えるには-魔法の言葉が必要です。コントロール内のイベントを次のように宣言します

 public event System.ComponentModel.PropertyChangedEventHandler MyPropChanged;

この名前は特別です:"YourPropertyName" + "Changed" =YourPropertyNameChanged 他の単語は魔法ではありません。イベントが宣言されるとすぐに-データソースは以前のように毎回更新されるわけではありません...

そして今、私はプロセスを制御することができます...

public void OnMyPropChanged(System.ComponentModel.PropertyChangedEventArgs e)
{
    Binding bb = this.DataBindings[0] as Binding;
    bb.WriteValue();
    if (MyPropChanged != null) MyPropChanged(this, e);
}

private void TxtChanged(object sender, EventArgs e)
{
    if (load) { return; }
    _my_prop = Txt.Text;   // ...
    OnValueTwoChanged(new PropertyChangedEventArgs("MyProp"));
}    

これは、より詳細なサンプルプロジェクトです。ここでは、StringプロパティValueTwo を使用してユーザーコントロールを作成し、カスタムロジックを使用して2つの異なるTextBoxに分割し、ユーザーがテキストを変更したときに値と更新を組み合わせます。

test_bind_fixed.zip

そして、これは私を助ける記事です http://support.microsoft.com/kb/327413

于 2012-09-11T17:13:35.443 に答える