1

他のものと同様の Gridview の並べ替えに問題がありますが、データ テーブルではなくコレクション オブジェクトにバインドしています。

アプリケーションの既存のビジネス ルールとデータ アクセス層は、オブジェクトを持ち、その型のオブジェクトのコレクションが必要な場合は、CollectionBase を継承して IBindingList を実装する別のクラスを持つというパターンに従います。

デスクトップ アプリケーションの場合、グリッドビューをこれらのオブジェクトの 1 つにデータバインドするのは簡単で、列の並べ替えをオンにしても問題はありませんでした。デスクトップ アプリのプレゼンテーション レイヤーでは、すべてが「状態」でした。

現在、そのコードは新しい Web アプリケーション (ASP.NET 2.0、VB コードビハインド ページ) に移行されています。

コレクションの特定の列のみをグリッドビューに表示するために必要なことをいじりましたが、グリッドビューはかなり見栄えがしました。「ソートを許可」をオンにすると、問題が発生しました。

.Sorting メソッドなどがないというエラーが表示されます。これを調査したところ、ソースがデータ テーブルである場合、データビューで簡単に実装できるあらゆる種類のソリューションが見つかりました。しかしそうではありません - それはコレクションです。コレクションをXMLメモリストリームに変換してデータソースを「チープショット」しようとしました.ReadXMLをデータセットに戻そうとしましたが、うまくいきませんでした[ルート要素が見つからないというエラーは、データセットで取得した限りです。 ReadXml(ioTemp) ここで、ioTemp は xml シリアライザーで使用される System.IO.MemoryStream でした]。

古いデスクトップ アプリのおかげで、コレクションが読み込まれると gridview がコレクションを処理するので、コレクションの並べ替えについて心配する必要はありませんでした。実際、コレクションの .SortProperty、.SortDirection、および .ApplySort がすべて NotSupportedExceptions を介して実行されるのは「標準」です (私はプログラマーからずっと前にこのコードを継承しました)。

コレクションをデータ テーブルに変換する簡単な方法や、毎回データベースに戻らずにコレクションを並べ替える方法はありますか? オブジェクト データ ソースは、オブジェクトの構築方法が複雑なルールであるため機能しません。VS2005 のウィザードは、必要なこと (複数のテーブルから条件付きでデータを取得してオブジェクトを作成する) を処理できません。

前もって感謝します。

4

5 に答える 5

2

代わりにクライアント側の並べ替えを検討しましたか?

私は過去にASPGridviewsでjquerytablesorterプラグインを使用しました。

http://tablesorter.com/

于 2009-02-05T19:55:54.313 に答える
0

この質問を最初に行ってから1年で、新しい「標準」を実装して、ビジネスオブジェクトのコレクションを汎用リストにすることができました。

したがって、「Collectionクラス」は、次のような並べ替えメソッドを持つ「Inherits List(Of MyBusinessObject)」にすぎません(パフォーマンスは問題ではありませんでした)。

Public Overloads Sub Sort(ByVal strPropertyName As String, ByVal strDirection As String)
    Dim arSortedList As New ArrayList
    For Each item As MyBusinessObject In Me
        arSortedList.Add(item)
    Next
    arSortedList.Sort(New CaseInsensitiveComparer(Of MyBusinessObject)(strPropertyName, strDirection))
    For intI As Integer = 0 To arSortedList.Count - 1
        Item(intI) = arSortedList(intI)
    Next
End Sub

これは、GridViewがイベントを発生させるために使用する方法論と完全に連携しているように見えました。

于 2010-01-04T12:28:00.100 に答える
0

グリッドに独自のオブジェクトのコレクションを入力しているように見えることを考えると、これはLinqforObjectsにとって完璧な仕事のように思えます。ほんの少しの肘のグリースで、コレクションに対するSQLSelectステートメントを効果的に実現できます。とてもかっこいいもの。

http://www.hookedonlinq.com/LINQtoObjects5MinuteOverview.ashx

また、本当にグリッド内のデータを並べ替えたいだけですか?もしそうなら、あなたのオブジェクトに対してLinqを使用することを間違いなく追求するでしょう。ただし、グリッドのコンテンツを並べ替えても実際に問題が解決することはめったにありません(「グリッドの並べ替え」は通常、グリッドを埋めるために使用されるデータのアクセスパスの変更に変換されます)。ブラウザーアプリはWindowsアプリとは異なり、 WindowsのDataGridViewが物事を見せてくれるのと同じくらい魔法のように物事を起こさせるための、基盤となるデータソースへのフルタイム接続。

于 2008-11-04T23:21:44.620 に答える
0

On_Click イベントを持つリンク ボタンを各列のヘッダーとして配置できます。

イベントがトリガーされたら、クリックされたヘッダーを特定します (ヘッダーごとに 1 つのメソッドまたは commandArgument 値)。それがわかったら、オブジェクトのコレクションに対して .orderBy または .OrderByDescending を実行し、結果をグリッドビューのデータソースとして戻し、その上でデータバインドします。

于 2010-01-02T18:20:41.497 に答える
0

同様の問題があり、オブジェクトに IComparable を実装する必要がありました。基本的に、オブジェクトのコレクションをソートするには、それらの順序を区別する方法が必要です。IComparable インターフェイスには、Compare と呼ばれるメソッドが 1 つあります。これにより、.Net フレームワークは、オブジェクトを並べ替えるときにオブジェクトの順序を決定できます。sort メソッドを機能させるには、このメソッドを自分で実装する必要があります。

Google 検索結果

エラーメッセージについて言及していないので、これが事実かどうかはわかりませんが、エラーを投稿できますか?

編集 :

あなたのコメントに関して; 複数列の並べ替えを実装できますが、より多くの作業が必要です。コレクションを並べ替えるフィールドを指定し、CompareTo メソッド内でこの情報を使用できます。

これを見てください

于 2008-11-04T19:23:55.537 に答える