問題タブ [bindinglist]
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.
c# - メンバーを追加するときに BindingList が System.ArgumentException をスローするのはなぜですか
特定の再現が難しい条件下で、値が追加されると次の例外がスローされるバインディングリストがあります。
System.ArgumentException: Complex DataBinding は、データ ソースとして IList または IListSource を受け入れます。System.ComponentModel.ReflectPropertyDescriptor.SetValue (オブジェクト コンポーネント、オブジェクト値)
で System.Windows.Forms.Binding.SetPropValue (オブジェクト値)
で System.Windows.Forms.Binding.PushData (ブール値の力)
で System.Windows.Forms.
System.Windows.Forms.CurrencyManager.CurrencyManager_PushData()
の System.Windows.Forms.BindingManagerBase.PushData () のBindingManagerBase.PushData(Boolean& success)
System.Windows.Forms.CurrencyManager.OnItemChanged(ItemChangedEventArgs e)
の System.Windows. Forms.CurrencyManager.List_ListChanged(オブジェクト送信者, ListChangedEventArgs e)
System.ComponentModel.ListChangedEventHandler.Invoke(オブジェクト送信者、ListChangedEventArgs e)
で System.ComponentModel.BindingList 1.InsertItem (Int32 インデックス、T アイテム) で System.Collections.ObjectModel.Collection`1.Add(T アイテム) ...1.OnListChanged(ListChangedEventArgs e)
at System.ComponentModel.BindingList
リストを作成するとき、またはプロパティの1つを変更するときに発生したかどうかは理解できましたが、これは特定の値を追加するときにのみ発生します. 次のように宣言されています。
そして、後で次のように使用します(例外がスローされる場所です):
さらに悪いことに、これは、ここに含まれるコードが最近編集されていない、以前は機能していた製品コードで発生しています。これはある種の微妙なデータ相互作用の問題であり、それがまれに発生する理由でもあるのではないかと疑っていますが、率直に言って、例外の起点が.Net内部の奥深くにあるため、途方に暮れています。
アップデート: 実際には単一のフォームではなく、複数のフォーム/ダイアログをサポートするために使用されるオブジェクト モデルの一部です。これは非常に複雑なコードであり、私が書いたコードではなく、単に維持/拡張しているにすぎません。コードを掘り下げた後、BindingList がさらにいくつかのドメイン オブジェクトに追加され、最終的にはオブジェクトの文字列プロパティを使用して ImageListBox を設定するために使用されるように見えます。問題の文字列は決して null または空白であってはなりませんが、コードが配置されている場所と、デバッガーを接続して検証するエラーを再現するのが難しいため、問題が発生します。null 値が原因で、問題が実際にある場所から遠く離れた場所で BindingList が例外をスローする可能性はありますか? このオブジェクトは、問題の ImageListBox リストへのデータ ソースとして最終的に割り当てられる前に、文字通り 3 つまたは 4 つの他のオブジェクト/コレクションに挿入されます (それでも、最終的に BindingList オブジェクトのどれが正確であるかについては、他のいくつかの選択に依存します)。リストの入力に使用されます)。
c# - BindingList.Sort() リストのように動作する。選別()
アプリケーションに使用できる SortableBindingList を作成しようとしています。基本的な並べ替えサポートを実装する方法について多くの議論を見つけたので、DataGridView または StackOverflow からのこの投稿を含む他のバインドされたコントロールのコンテキストで使用されたときに BindingList が並べ替え
られます。
これはすべて非常に役に立ち、コードを実装してテストなどを行い、すべて機能していますが、私の特定の状況では、Sort() への単純な呼び出しをサポートし、その呼び出しでデフォルトの IComparable を使用できるようにする必要があります。 ApplySortCore(PropertyDescriptor, ListSortDirection) を呼び出すのではなく、CompareTo() で並べ替えを行います。
その理由は、Sort() 呼び出しに依存するコードが非常に多くあるためです。これは、この特定のクラスが元々 List から継承され、最近 BindingList に変更されたためです。
具体的には、VariableCode というクラスと、VariableCodeList というコレクション クラスがあります。VariableCode は IComparable を実装し、そのロジックはいくつかのプロパティなどに基づいて適度に複雑です...
Sort() で ApplySortCore メソッドを転用しようとしていくつか失敗しましたが、ApplySortCore は PropertyDescriptor がソートを行うことを期待しており、それを取得して IComparable を使用する方法がわかりません。 .CompareTo() ロジック。
誰かが私を正しい方向に向けることができますか?
どうもありがとう。
編集: これは、将来の参考のために Marc の応答に基づく最終的なコードです。
c# - IEnumerable をキャストできない理由BindingList へのリスト?
IEnumerable リストを BindingList コレクションにキャストすることは可能ですか?
IEnumerable リストは、次のような型付きオブジェクトのリストです。
そして、私の PagingList は BindingList を拡張するだけです:
PagingControl でリストをレンダリングするメソッドに IEnumerable リストを渡したかっただけです。
しかし、私は2つの間でキャストできないようです.誰かが私が欠けているものを指摘できますか?!
どうもありがとう
ベン
c# - BindingList のメモリ リーク
私のアプリケーションは、すべての UI コントロールにバインドされる Bindinglist から継承するカスタム リストを使用します。リストは、INotifyPropertyChanged を実装する baseobjects のコレクションです。メモリ リークが疑われ、memprofiler を使用してアプリケーションのプロファイリングを行ったところ、すべてのリストが決して破棄されず、バインディング リストの propertyChanged イベント ハンドラにサブスクライブされているため、それらがくっついていることが確認されました。
ここに私のオブジェクトのサンプルがあります
プロファイラーからの割り当てスタックは次のとおりです
誰かがリストを処分するのを手伝ってくれますか?
皆さんありがとう
ヘンク、あなたは正しかった。問題は、私が言及したコードではなく、フォームの破棄を妨げているデリゲートに絞り込みました。サイトにアップロードする問題を再現するサンプルに取り組んでいます。ありがとう
c# - DataGrid にバインドできるカスタム コレクションの作成
私は建築会社で働いており、設計を支援する 3D モデリング プログラムのプラグインを作成しています。BuildingクラスとFloorクラスがあります。建物には、フロアのFloorListコレクションへの参照が含まれています。コレクションを編集するためのインターフェイスを作成するために必要な作業量を最小限に抑えるために、 FloorListコレクションのベースとなるものを見つけようとしています。
Floorコレクションは、互いに積み重ねられた一連の建物の床を表します。各Floorには、読み書き可能なFloor.Heightプロパティと、読み取り専用で現在のFloorより下の床の高さを合計して設定されるFloor.Elevationプロパティがあります。したがって、Floorがコレクションで追加、削除、移動、または変更されるたびに、Floor.Elevationプロパティを更新する必要があります。
さらに、このコレクションを編集するための UI を作成したいと考えています。各フロアがその高さとその他のプロパティと共にコントロールの行としてリストされているDataGridコントロールを使用することを考えていました。ユーザーは、コントロールを使用してフロアを追加、削除、並べ替えできる必要があります。これをできるだけ簡単かつ柔軟に設定したいと思います。つまり、Floor のコレクションをDataGridにバインドし、 Floorのプロパティに基づいてDataGridの列を設定できるようにしたいということです。クラス。可能であれば、コレクションとDataGridの間に一連のイベント関係を設定する必要なく、 DataGrid コントロールの組み込みの追加/削除 UI インターフェイスを利用できるようにしたいと考えています。
将来的に事態をさらに複雑にするために、ユーザーがフロアにカスタム プロパティを動的に追加できるようにする必要があります。これらのプロパティは、 DataGridでも表示および編集できるようにする必要があります。FloorクラスにIExtenderProviderを実装させることで、それを行うことになると思います。したがって、最終的にDataGridは次のようになります。
私の質問は、この機能を可能にするために、 FloorListコレクションを何に基づいて作成する必要があるかということです。私が検討しているオプションは次のとおりです。
1) リスト(フロア)から継承
- Add/Remove などのメソッドは仮想的ではないため、それらをオーバーライドして標高を更新することはできません
2) IList(フロア) を実装する
OnChange イベントは組み込まれていないため、リストが変更された場合、DataGrid は更新されません (私は思いますか?)
これがおそらく最良の選択肢だと思いますが、FloorListコレクションまたはDataGridへの変更が互いに同期されるようにするにはどうすればよいでしょうか?
3) BindingList(Floor) から継承
- 追加/削除などのメソッドは仮想ではないため、それらを変更して床の高さを更新することはできません。
4) IBindingList を実装する
- IBindinglist はジェネリックではなく、コレクションにFloorオブジェクトのみを含めたい
datagridview - どこで/いつ/どのようにBindingListを実行しますかPropertyChangedをListChangedイベントに変換/配線します
すべてINotifyPropertyChangedを実装するオブジェクトの階層があります。BindingListから派生したカスタムリストもあります。
INotifyPropertyChangedを含意するオブジェクトをリストに追加すると、どういうわけかPropertyChangedイベントが自動的にワイヤーアップ/ListChangedイベントに変換されることを理解しています。
ただし、リストをDataGridViewのデータソースとして設定した後、グリッドの値を変更しても、ListChangedイベントは発生しません...コードにステップインすると、PropertyChanged()イベントは発生しません。 nullであるためにトリガーされます。これは、想定されているように、BindingListのListChangedイベントに接続/変換されていないことを意味すると思います...
例えば:
そして、これが私のカスタムリストクラスです...
何かアイデアや提案はありますか?
ありがとう!
ジョシュ
c# - DataTable から BindingList へ
私は DataTable から BindingList に切り替える過程にあります。DataTable を DataGrid オブジェクトにバインドします。
ここに私のジレンマがあります。切り替えの利点は確かにわかりますが、私の状況では少し複雑になり、切り替える価値があるかどうか疑問に思っています。
私のシナリオ: 化学サンプルを表示する DataGrid があります。5 種類のサンプル タイプがあり、グリッド内の列はタイプごとに異なります (場合によっては、他のパラメーターに基づいて同じタイプ内で)。一部の列は同じままで、一部は 3 つの型で存在し、一部は 4 つの型で存在するなどです。単純な継承の場合とは異なります。現在、BindingList を使用する場合に必要となる、サンプルの種類ごとにプロパティを持たなくても、必要な列をロードできるため、簡単に DataTable を使用できます。ただし、BindingList を使用すると、後でサンプル プロパティを簡単に参照できるようになります。
これは、このオブジェクト (BindingList) を使用した初めての経験なので、どんな提案も歓迎します。私が知っていることから、BindingList はプロパティにバインドします。だから私が持っている場合:
次のようなものがある場合、グリッドは Sample クラスのプロパティにバインドされます
つまり、6 種類のサンプルがあり、すべてプロパティが定義されています。最終的な継承構造は複雑になる可能性があるため、それだけの価値があるかどうか疑問に思っています。どんなフィードバックでも大歓迎です。
私はc#2.0を使用しています。Windows アプリです。
c# - BindingList と列の柔軟性
誰もが DataTable の代わりに BindingList を絶賛しています。
列の柔軟性の問題をどのように克服していますか? BindingList の場合、T オブジェクトを定義して実装する必要があります。新しい列を追加する必要がある場合は、T オブジェクトに新しいプロパティを追加する必要があります。DataTable では、これははるかに簡単です。
それはあなたが一緒に住んでいることですか、それとも比較的簡単に克服する方法はありますか?
c# 2.0、コンパクトなフレームワークを使用。
c# - BindingList へのバインド- バインドするものを選択しますか?
Sample というビジネス オブジェクトがあり、Sample の BindingList があるとします。サンプルには 4 つのプロパティがあります。
DataGrid にバインドされているプロパティを選択できますか? または、そのようなものをカスタマイズするオプションはありませんか?
注: 私は、Autogenerate プロパティと DataMember プロパティだけでなく、DataGridView もない Compact Framework を使用しています。
返信する際は、この点に注意してください。
c# - c# 2.0 (BindingList) でのジェネリックとの共分散の欠如に対する解決策
設計上の質問です。ビジネス オブジェクトと、そこから派生した 5 つのビジネス オブジェクト タイプがあります。
また、メンバーとして BindingList を持つクラスも作成します。そこから派生した5つのクラスがあります。
ここでは共分散が機能しないため、コードの繰り返しを最小限に抑えるために設計をどのように構成しますか? もちろん、BindingList をチャックして DataTable を使用することもできます。その場合、問題は解消されます。
しかし、誰もが BindingList を絶賛しているので、皆さんがこれにどのようにアプローチするかを知りたいです。
解決策(Pavel Minaevの回答に基づく):