問題タブ [bindingsource]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 並べ替えられた EntitySet を使用した Datagridview? (.NET 3.5)
何時間ものグーグルで見逃したこれに対する簡単な答えがあることを願っています...
データベースからレコードを表示および追加/削除/編集する必要がある DataGridView があります。私は Entity Framework を使用しているため、レコードは最初は EntitySet です。
- 試行 1
BindingSource には並べ替え機能がありますが、DataSource が EntitySet の場合、実際には利用できないようです。
- 試行 2
グリッドにカスタム ソートを実装してみてください。ただし、グリッドがデータバインドされている場合、カスタム ソートは許可されません。
- 試行 3
データに対して Linq クエリを実行し、そこで order 関数を使用します。これは注文したデータを取得するために機能しますが、AllowNew が false に変更されました。強制的に元に戻すことはできますが、DataGridView に追加されたレコードが EntitySet に追加されません (奇妙なことに、すべての更新が反映されます)。
- 試行 4
#3 のとおりですが、BindingSource の AddingNew イベントを処理し、オブジェクトを明示的に作成して EntitySet に追加します。これは、ユーザーがグリッドの下部にある新しいエントリ行を入力すると、デフォルト値でいっぱいの行がデータベースに追加されることを除いて機能します。ユーザーが行を入力し続けると、大量の行が取得されます。だからそれもダメ。
これを行う方法が必要です-確かに、いくつかのデータベースレコードをグリッドに表示し、完全な編集を許可することは、最も基本的な要件です(行をランダムな順序で表示することはあまり役に立ちません)?
最も感謝して受け取った助け...
c# - C#WinForms BindingList&DataGridView-EDITを禁止すると、新しい行の作成が妨げられますか?どうすればこれに対処できますか?
BindingListでのDataGridViewの使用に関して、現在の行の編集を無効にしましたが、新しい行の追加は許可しました。私が抱えている問題は、編集を許可しない場合、この新しい行のセルにテーブルを作成すると編集が許可されないように見えるため、新しい行アイテムを追加できないように見えることです。
これを回避する方法を知っていますか?以下の私のコードのセクション:
ありがとう
inotifypropertychanged - PropertyChangedイベント、OnClick時に発生しますか?
INotifyPropertyChangedを実装し、イベントをビジネスオブジェクトレイヤーに戻すフォーム上のいくつかのコントロールとBindingSourceを介してPropertyChangedイベントをフックするいくつかのビジネスオブジェクトを備えたWinFormsアプリケーションがあります...
1つだけ問題があります。コントロールがフォーカスを失った場合を除いて、すべてが正常に機能します。たとえば、ユーザーはテキストフィールドを変更しますが、「保存」ボタンを押す前に、実際にはどこかで他のコントロールをクリックする必要があります(たとえば、別のコントロールにフォーカスを合わせる必要があります)。
これをOnClickなどに接続して、ユーザーがテキストを入力すると(または、ドロップダウン値を変更した後でも)変更がビジネスオブジェクトレイヤーに伝達されるようにする方法はありますか?ユーザーに強制する必要はありません。保存する前に別のテキストボックスをクリックしますか?
グーグルは私をどこにも導きませんでしたが、WPF =(でこれを簡単に行う方法の例になりました。しかし、WinFormsの例はありません...
お知らせ下さい、
ドリュー
winforms - 挿入後の BindingSource の更新 (Linq To SQL)
次のように、テーブルにBindingSourceバインドされたグリッドにバインドされています。DataContext
BindingSource挿入後に更新できませんでした。これはうまくいきませんでした:
これも:
私は何をすべきか?
.net - WriteValueを使用した手動データバインディング
DataSourceUpdateMode = Neverを設定してバインディングデータソースの自動更新をオフにしてから、ボタンを使用してロット全体を更新すると(binding.WriteValueを使用)、問題が発生します。つまり、最初のバインドされたコントロールのデータソースのみが更新されます。他のすべてのコントロールは元の値にリセットされます。
これは、現在のオブジェクトが変更されたときに(上記のWriteValueの後に発生するように)、ControlUpdateMode = OnPropertyChangeの場合、他のすべてのコントロールがデータソースから値を再読み込みするためです。
この問題を回避するための標準的な方法は何ですか?
1つの方法は、BindingSourceからクラスを派生させ、WriteAllValuesメソッドを追加することです。このメソッドは次のことを行います。
(1)バインディングごとに、ControlUpdateModeを保存します
(2)バインディングごとに、ControlUpdateMode=Neverを設定します
(3)バインディングごとに、WriteValueメソッドを呼び出します
(4)バインディングごとに、ControlUpdateModeを保存された値にリセットします
(5)バインディングごとに、ControlUpdateMode = OnPropertyChangeの場合、ReadValueメソッドを呼び出します。
これを行うことで何か問題がありますか?
独自のクラスを使用している場合、IEditableObjectを実装すると問題は解決しますか?
私が取り組んでいる別のコントロールでは、独自のバインディングを実装しています。その中で私が問題を回避する方法は、次のコードを使用することです。(私は最低限を入れました、あなたがそれに従うことができることを願っています!):
したがって、UpdateDataSourceFromControlが呼び出されると、すべてのCurrentItemChangedイベントが、同じBindingSource内の他のすべてのコントロールに対して呼び出されます。ただし、ControlDoingExplicitUpdateが設定されているため、更新を行ったコントロールでない限り、データソースから値を再読み込みすることはありません。これらのイベントがすべて完了した後、ControlDoingExplicitUpdateはNothingに設定されるため、通常のサービスが再開されます。
私はあなたがこれに従うことができることを願っています、そして-もう一度-私は尋ねます、あなたはこれに関する何か問題を見ることができますか?
c# - BindingSource には変更が表示されますが、DataTable には表示されません
私は最近、Java/RMI から C#/.net に切り替え、データバインディングを使用して Oracle のレコードを更新する最初のプロジェクトに取り組んでいます。私が作成しているこの最初のフォームには、車両記録 (VIN、年/メーカー/モデル、ナンバー プレート番号など) の詳細ビューがあります。DB への書き込みに関して最初にしたことは、更新を保存することでした。
すべて問題ないように思えたので、新しいレコードの追加に進みました。ボタンを作成し (さまざまな人が、バインディング ナビゲーターを使用するよりも自分で作成した方が良い、またはそれよりも優れていると言っているオンラインを見ました)、これをハンドラーに入れました。
そのため、(上記) 必要な列に初期値を入力しています (VEH_ID は PK です)。次に、アプリを実行し、VIN のテキスト ボックスに値を入力して保存し (上記と同じコード)、今度は GetChanges() が null を返しました。
そこで、最初の代わりに、「新規追加」ボタンハンドラーでこれを試しました。
今、私は本当に興味深いことが起こっています。
- 既存のレコードを選択するまで、新しいレコードのデータをいくつでも正常に入力して保存できます。既存のレコードに移動してから新しいレコードを追加すると、新しいレコードを保存するときに、コードで明示的に設定された値が DB に書き込まれますが、GUI に入力されたデータは、新記録。
- 新しいレコードを入力するまで、既存のレコードをいくつでも変更できます。1 つまたは複数の新しいレコードを追加して保存し、既存のレコードに変更を保存しようとすると、GetChanges() の呼び出しで null が返されます (つまり、GUI から入力された内容を「認識」していないようです)。
したがって、どちらの場合も、古いものから新しいものへ、または新しいものから古いものへの変更によって、GUI に入力された内容をデータテーブルが認識できない状態になるように見えます。ただし、古いものから新しいものへの変更では、既存のレコードを選択するだけで済みますが、新しいものから古いものへの変更では、保存後に壊れるだけです (新しいレコードを保存せずに破棄すると、既存のレコードを問題なく変更できます)。 .
実際の保存の直前にこれを保存ハンドラーに追加しました(chはデータテーブルであるためループ内ですが、実際にはコードは、先に進む前に新しいレコードを保存または破棄する必要がある場所に設定されています-したがって、ループ一度だけ実行します):
この特定のテキストボックスがバインドされている列はどこですかVIN_ID(フォームの他のフィールドでもこれを試して、その 1 つのテキストボックスについて不安定なものではないことを確認しました)。最初のメッセージ ボックス (バインディング ソースの DataRowView) には、テキスト ボックスに入力した vin が表示されます。2 番目のメッセージ ボックス (GetChanges() によって返されるテーブルの行)VIN_IDには、 と の正しい (コードによって設定された) 値がVEH_IDありますが、 の空の文字列が表示されますGRNTE_ID。GRNTE_IDその列にバインドされたコンボ ボックスを使用するために別の値を選択すると、同じことが起こります。データテーブルの行には、コードで設定された値がまだあり、GUI で選択された値を「認識していません」。
データテーブルとバインディング ソースが同じフィールドに対して異なる値を持つのはなぜですか? そして、なぜデータテーブルは、ユーザーが既存のものから新しいもの、または新しいものから既存のものに切り替えるまで、GUI から入力された値を「見る」ことができるのでしょうか?
ありがとう。
エンジェル: 私は自分のサービスでそれをやっています:
これは、元の投稿のこのブロックから呼び出されます。
ヨハネス:
EndEdit() の呼び出しは、保存ハンドラーの 2 行目 (私の投稿の上部近く) です。私はそれを別の場所でも呼び出す必要がありますか?
ありがとう。
明確にするために: SaveVehicles が呼び出される前に問題が発生しているため、SaveVehicles が問題の原因になることはありません。EndEdit() が呼び出された後、実際に DB に何かが書き込まれる前に、BindingSource と DataTable の間で不一致が生じる可能性があるのはどのような条件ですか?
c# - 新しく追加された行を選択します-DataGridViewとBindingSource
DataGridViewにバインドされているBindingSourceに新しい行を追加しています
この後、BindingSourceを使用して、新しく追加された行を取得し、ソート時にDataGridViewの次の行を返します。
myBindingSource.CurrentはROW"C"を提供します。(DataGridViewで選択された行になりました)
新しく追加された行だけを更新したいので、これが必要です
テーブル全体ではありません。
また、挿入後にDataGridViewでこの新しく追加された行を選択してもらいたいと思います。
なんらかの方法で可能ですか?
c# - gridview/bindingsourceでレコードを並べ替える
TelerikのWinFormsコントロールを使用しており、データを表示するためにバインディングソースにバインドされたradGridViewがあります。この機能を少し拡張して、ユーザーがレコードを注文するための追加の方法を提供したいと思います。
この機能を容易にするために、グリッドビューに2つのコマンドボタン(上、下)を追加しました。基本的に、「上へ」ボタンをクリックすると、現在の行が上の行と場所を切り替えたいと思います。「下」ボタンをクリックすると、現在の行が下の行に切り替わります。
データ例:
1
2
3
4
5
3行目で[上へ]ボタンをクリックすると、データは次のようになります。
1
3
2
4
5
3行目で「下」ボタンをクリックすると、データは次のようになります。
1
2
4
3
5
どうすればこれを達成できますか?これらの行のバインディングソースの位置、またはグリッドビュー行のインデックスを変更する必要がありますか?別の方法?どんな例でも大歓迎です!
c# - 行を BindingSource に追加すると、DB に保存されたものとは異なる自動インクリメント値が得られます
レコードのリストを表示する DataGridView があり、挿入ボタンを押すと、フォームは新しいレコードを追加し、その値を編集して保存する必要があります。
DataGridView にバインドされた BindingSource があります。私はパラメータとして NEW RECORD フォームに渡すので、
ユーザーがそれを保存することを確認したら、私は
フォームが破棄された後、新しい行が保存され、バインディングソースの位置が新しい行に更新されます
問題は、このテーブルに AUTOINCREMENT フィールドがあり、保存された値が bindingSource が EDIT TIME で指定した値と一致しない可能性があることです。
そのため、DataGridView を閉じて再度開くと、新しい行は、保存された瞬間に元の DB で使用可能なスロットに基づいて ID を与え、BindingSource が生成した広告の値を無視するだけです EDIT TIME,
バインディング ソースによって指定された値は、別のテーブルで foreingKey として使用される必要があるため、参照が矛盾します。
データベースに保存された実際の ID を取得する方法はありますか?
.net - マスター詳細挿入フォームの作成方法
私はNorthwind データベースを使用しており、 C# .Net Framework ウィンドウ フォームを作成して注文入力を生成したいと考えています。
データセット内のテーブルとバインディング ソースを既にリンクしており、バインディング ナビゲーターを使用してそれぞれを表示できるようにしました。
問題は、DB に null 値を挿入するという例外がスローされるため、注文の詳細を未作成の注文に追加する方法を見つけることができないことです。(オートインクリメントを使えば解決すると思っていたのですが、そうではありません)
皆さんは何か考えがありますか?