none
DataGridViewCellクラスにIExtenderProviderで独自プロパティを追加したい。 RRS feed

  • 質問

  • 閲覧して頂ける方の時間を割いてしまい、さらには返信頂きお世話にもなりっぱなしで
    申し訳ないのですが、また質問させて下さい。m(_ _;)m

    【開発環境】
    Visual Studio Express 2013 for Windows Desktop(2.0.30723.00 Update3)
    Framework(4.6.01055)
    Visual Basic 2013(06157-004-0441005-02597)

    【質問内容】
    タイトルの通りなのですが、
    DataGridViewCellを継承した独自クラスにプロパティを追加する方式ではなく、
    DataGridViewCellそのものにプロパティを追加したいのですが、色々調べたところ
    IExtenderProviderを使えば出来そうな気がするのですが使い方がよく分からず

    どなたかよろしければご教示頂けたら嬉しいのですが。。。分かる方おりますでしょうか?

    以下を翻訳して見ていたのですが、DataGridViewCellへのプロパティ追加となると正直よく分からず。。。(;_;)
    https://www.codeproject.com/Articles/16986/Customizing-a-Component-Inheriting-vs-IExtenderPro
    https://social.msdn.microsoft.com/Forums/windows/en-US/2051399e-df0e-4366-aa4b-2a279ebce8fb/iextenderprovider-for-datagridviewcolumns-doesnt-work?forum=winformsdatacontrols
    2017年11月6日 6:44

回答

すべての返信

  • と迷走している印象を受けます。本当に実現したいことは何でしょうか? 最初のスレッドが端的に尋ねられているようにも思いますが、それで何がいけなかったのでしょうか?

    なお、DataGridViewにはデータバインディングという機能が提供されています。これを使用することで、元になるデータをDataGridViewが直接参照・編集を行うことができます。DataGridViewコントロールで様々な処理を作り込むのであれば、まず真っ先にデータバインディングを行うべきです。

    2017年11月7日 1:40
  • 返信が遅れて大変申し訳ありませんでした。
    おっしゃる通り、迷走しておりました。
    最初の質問の趣旨は、Undoの実装でした。
    みなさんに方策を頂き、一旦、CellChangedイベントでの値保持を元にした実装を考えました。
    しかしこれだと列や行の追加などがあると、以前の値がなんであったのかを取得するまでが面倒だなと思い、
    改めて別の方法を考え、Valueプロパティまでのルートをもつクラスを全て自作してオーバーライドし、
    ValueプロパティのセッターにUndo管理用の処理を入れてしまおうとコーディングを進めたのですが・・・
    独自クラスと標準クラスとの違いをうまく隠蔽/吸収出来ず、また新たな方法を模索し始めました。。汗
    そしてIExtenderProviderを使ったら、もしかしたら継承クラスにしなくても、
    標準のValueプロパティを乗っ取れるかもしれないと思ってさらに迷走した質問に至ります。

    その後、どうにもならず今度はおっしゃる通りのDataTableをバインドして、
    AddHandleしたDataTable側のイベントでUndo管理するようにし、やっと形になってきた感じです。

    当初、DataTableなどバインドしなくてももっと簡単に変更前値を取れるだろうと甘く考えていました。
    その時点でデータバインディングは無いと決めつけていた自分を恥じております。

    紆余曲折を経て迷走した質問にお付き合い頂き、大変申し訳ない思いです。
    しかしなんとかゴールが見えてきました。

    佐祐理様、他、みなさん本当にありがとうございました。m(_ _)m



    2017年11月20日 6:11