2009-04-09 15 views
4

昨日、ある同僚が、組み込みのデータバインディングが一部の列に対して何をしたいかをサポートしていないグリッドにデータを表示する方法を私に尋ねました。フォームDataGridViewにOnRowDataBoundがありませんか?

私はOnRowDataBoundイベントについて説明し、どのようにそれにフックして行オブジェクト内のセルを動的に操作して、必要なものをほとんど行うかを説明してくれてうれしく思います。すばらしいです。 asp.netで作業している場合。

彼はwinformsアプリケーションを書いているだけで、DataGridViewはOnRowDataBoundをサポートしていません!私はそれを信じることができませんでしたが、それだけではありません。

どのようにwinformsの人はこれを管理しますか?

答えて

2

イベントはほぼ同等ですが、使用するshared memory stateのためにこのイベントを使用して行にアクセスするとパフォーマンスの問題に遭遇する可能性があります。これは、本質的には、からまでの間で可能な場合に状態を共有することによって、DataGridViewがメモリフットプリントを最小限に抑えようとするスキームです。共有行の1つにアクセスすると、状態(メモリおよび可能なパフォーマンスヒット)が非共有になります。多くは最適化されていますが、私はこのイベントを何らかの理由で使用することに問題を抱えています。

したがって、パフォーマンスの低下なしに行が追加された場合は、素晴らしい結果が得られます。そうでない場合は、まだ多くのオプションがあります。 DataGridViewCellおよびDataGridViewから派生させて、カスタムセル(列)型をグリッドに追加できます。これは、おそらく、DataGridViewをカスタマイズする最も複雑な方法です...しかし、それはあなたが望むだろうあらゆる種類の細胞操作を可能にします。

CellPaintingイベントは、表示する前にGDI +(System.Drawing)でペイントしたい場合に、特定のセルのペイントにフックを与えます。特別なイベント引数を与えるCellFormattingイベントもありますが、私はこれを使ったことがないので、共有メモリ状態の問題が適用されるかどうかはわかりません(通常はそうでないペイントイベントの場合)。

HTH、 リチャード

ので
0

私はASP.NETの人でもありますが、winformsでは「擬似ステートフル」(ビューステート)環境ではなく、真のステートフルな環境で作業します。

すべてがレスポンスにフラッシュされる前に(セルスタイルの変更など)すべてを行う必要がないため、データがバインディングを終了してから適切に各行を変更するまで待つことができます。まだあなたのデータソースを持っているので、あなたがそれ以上何かをする必要がある場合は、それを使用してください。

0

に(そのような変更のセルスタイルなどなど)すべてを行う必要はありませんので、すべてがレスポンスにフラッシュされる前に、データバインディングと完了するまで、あなたは待つことができますそれぞれの行を適切に表示するように変更すると、まだデータソースが得られているので、何か他のことをする必要がある場合は、それを使用してください。

明らかにするために、datagridviewは現在バインドされており、既存のバインドされた列を表示します。 これで、datagridviewに新しい列を追加し、辞書オブジェクトからいくつかの値を表示する必要があります。

試してみましたが、このコードは運がありません。列は追加されますが、値は表示されません。

    if (dvMain.Columns[key] == null) 
        { 
         dvMain.Columns.Add(key, key); 
        } 
        dvMain[key,i].Value = myDictionary[key]; 
+0

これは、列が追加される方法と関係があります。列がデータバインディングの前に追加されていれば、確実に機能しますが、バインド中に列を追加できないとは限りません。 – NeedHack

関連する問題