- PR -

DataGrid(Windows Form)のチェックボックスについて

1
投稿者投稿内容
00_Number
常連さん
会議室デビュー日: 2003/11/04
投稿数: 37
投稿日時: 2004-05-05 23:31
いつもお世話になっております。

DataGrid(Windows Form)でチェックボックスを使用したいためにDataGridBoolColumnを用いたのですが、チェックボックスの値が変更された時に発生するイベントを取得したいのですが、実現出来ずに困っています。

既出の質問のようで、データグリッドを継承した、カスタムグリッド内にColumnStartedEditingをオーバーライドさせる事でイベントを取得する事が出来ると以下のURLには書かれているのですが、
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9380&forum=7&3
オーバーライドしたColumnStartedEditingの中にどのような処理を書けばいいのか分かりません。

既出の質問で申し訳ないのですが、分かる方いらっしゃいましたらご回答をお願い致します。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-06 00:20
諸農です。

引用:

ColumnStartedEditingをオーバーライドさせる事でイベントを取得する事が出来ると以下の



こんなのがあったんですね。勉強になります。

引用:

DataGrid(Windows Form)でチェックボックスを使用したいためにDataGridBoolColumnを用いたのですが、チェックボックスの値が変更された時に発生するイベントを取得したいのですが、実現出来ずに困っています。
<中略>
オーバーライドしたColumnStartedEditingの中にどのような処理を書けばいいのか分かりません。



えっと、カラムスタイル単位でイベントを実装させるのであ
れば、まずはオーバーライドした元コードの呼び出しを行っ
てから、自分で定義したイベントハンドラを呼び出せばいい
のではないでしょうか。もしくはControlパラメータを使って
Controlのイベントハンドラを呼び出してもいいかも。
利用側は、イベントデリゲートタイプと同じメソッドを準備
しておいて、ハンドラに登録すればイベントが発砲されるタ
イミングで、通知を受け取る事が出来ますよね。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
00_Number
常連さん
会議室デビュー日: 2003/11/04
投稿数: 37
投稿日時: 2004-05-06 02:13
Jubeiさん、ご回答ありがとうございます。

引用:


えっと、カラムスタイル単位でイベントを実装させるのであ
れば、まずはオーバーライドした元コードの呼び出しを行っ
てから、自分で定義したイベントハンドラを呼び出せばいい
のではないでしょうか。もしくはControlパラメータを使って
Controlのイベントハンドラを呼び出してもいいかも。
利用側は、イベントデリゲートタイプと同じメソッドを準備
しておいて、ハンドラに登録すればイベントが発砲されるタ
イミングで、通知を受け取る事が出来ますよね。




実は自分はオーバーライドを行ったメソッドの拡張を今までに少ししかやった事がなく、どういった理屈で今回の教えて頂いた処理も実現出来るのかが今ひとつ理解出来ていません。
今までにも.NET既存のメソッドのオーバーライドについては調べようとはしたのですが、まわりに詳しい者がおらず何を調べれば拡張の手順や方法論を理解出来るのかがさっぱりでして。。。
丁寧に手順を教えて頂いた後で大変申し訳ないのですが、よろしければ教えて頂いた方法を理解するのに役立つHPか文献、もしくはサンプルソース等を教えて頂ければと思います。
00_Number
常連さん
会議室デビュー日: 2003/11/04
投稿数: 37
投稿日時: 2004-05-06 12:09
追記です。
一応分からないなりに教えて頂いた方法に沿って書いたソースを記述します。

'自分で定義したイベントハンドラ
Public Delegate Sub BoolColumnCheckChanged()

'DataGrid拡張クラス
Public Class DataGridPlus
Inherits System.Windows.Forms.DataGrid

'ColumnStartedEditingをオーバーライド
Protected Overloads Overrides Sub ColumnStartedEditing(ByVal editingControl As System.Windows.Forms.Control)
'オーバーライドした元コードの呼び出しを行う
Me.ColumnStartedEditing(editingControl)
'? (ここで自分で定義したイベントハンドラを呼び出す?)

End Sub

End Class

--------------------------------------------------

利用側については、Form_Loadイベントなどの中でAddHandlerでハンドラに登録すれば良いのでしょうか?

すみません。手探りでやってはいるのですがなかなか理解度が上がらずに困っています。
解釈の誤っている点、間違っている点がたくさんあると思いますので、修正点についてご指摘頂ければと思います。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-07 01:10
諸農です。

DataGridBoolColumn派生で考えてみました。

試してはいないのですが「編集開始通知」の方だと
クリック単位での追跡が出来ないからと思って。。

最終的にEditメソッドとPaintメソッドのoverrideで
「クリックされた」という事を知る事が出来るように
はなったのですが、見た目は変更されている様に見え
るCheck後の値をどうしても取得することができなか
ったんです。。ちょっと悔しい(-_-;)

#Commitされるまではダメみたいな感じ。。
#目下のところほかに手がないか色々やっております。

で、申し訳ないのですが、コードはC#で記述しています。。m(__)m

コード:
/*
 イベントハンドラデリゲートで使うイベント引数クラスです。
 これは変更対象になったCell情報をアプリケーションに通知
 するために作りました。
*/
public class BoolCheckedEventArgs:EventArgs
{
    public DataGridCell Cell;
}
/*
 イベントハンドラで利用するデリゲートのプロトタイプ宣言
*/
public delegate void BoolCheckedEventHandler(object sender,BoolCheckedEventArgs e);

/*
 表示されているCheck値の「見た目の変更」を
 追跡できるDataGridBoolColumnクラスです
*/
public class MyBoolColmun:DataGridBoolColumn
{
    private int currentRowNum = -1;
    DataGridCell cell;

    /*
     イベント
    */
    public event BoolCheckedEventHandler BoolChecked;

    /*
     セルがクリックされるとEditメソッドが呼ばれるので、
     このメソッドで現在編集が開始されようとしているセルを取得します。
    */
    protected override void Edit(CurrencyManager source, int rowNum,
                                 Rectangle bounds, bool readOnly,
                                 string instantText, bool cellIsVisible)
    {
        currentRowNum = rowNum;
        cell = this.DataGridTableStyle.DataGrid.CurrentCell;
        base.Edit(source,rowNum,bounds,readOnly,instantText,cellIsVisible);
    }

    /*
     見た目のCheck値が変化すれば再描画されるので、
     再描画のタイミングで再描画対象のセル情報と編集開始時に
     取得したセル情報を比較し、セルが同じであるならイベントを
     発砲(Fire)しています。
     もちろんイベントが格納されている変数にイベントが登録され
     ているかどうかの確認は行います。
    */
    protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source,
                                  int rowNum, Brush backBrush, Brush foreBrush,
                                  bool alignToRight)
    {
        DataGridCell c = this.DataGridTableStyle.DataGrid.CurrentCell;
        
        if ((currentRowNum == rowNum)&&(cell.ColumnNumber == c.ColumnNumber))
        {
            if (BoolChecked != null)
            {
                BoolCheckedEventArgs e = new BoolCheckedEventArgs();
                e.Cell = c;
                BoolChecked(this,e);
            }
        }
        base.Paint (g, bounds, source, rowNum, backBrush, foreBrush, alignToRight);
    }
}

利用側コードは以下の通りです。

/*
 カスタムクラスのイベントハンドラに登録するメソッド
 ここではイベントで引き渡されるセル情報をListBoxに
 表示しているだけです。
*/
private void boolChanged(object sender, BoolCheckedEventArgs e)
{
    listBox1.Items.Add(e.Cell.ToString());
}

/*
 カスタムクラスの使い方です。
*/

    DataTable tbl = new DataTable("Test");
    tbl.Columns.Add("Col1",typeof(int));
    tbl.Columns.Add("Col2",typeof(bool));
    tbl.Columns.Add("Col3",typeof(string));
    for (int i =0;i<10;i++)
    {
        DataRow r = tbl.NewRow();
        r["Col1"] = i;
        r["Col2"] = ((i % 2) == 0);
        r["Col3"] = ((bool)r["Col2"]).ToString();
        tbl.Rows.Add(r);
    }
    dataGrid1.DataSource = tbl;

    DataGridTableStyle dgt = new DataGridTableStyle();
    dgt.MappingName = "Test";

    //これは別のカスタムクラスです(^^;
    MyTextColmun dgb1 = new MyTextColmun();
    dgb1.Width= 100;
    dgb1.MappingName = "Col1";
    dgb1.BoolChecked += new BoolCheckedEventHandler(boolChanged);
    dgt.GridColumnStyles.Add(dgb1);

    //通常のTextBoxColumnクラス
    DataGridTextBoxColumn dgb2 = new DataGridTextBoxColumn();
    dgb2.Width= 100;
    dgb2.MappingName = "Col3";
    dgt.GridColumnStyles.Add(dgb2);

    //今回作成したカスタムクラス
    MyBoolColmun mbc = new MyBoolColmun();
    mbc.Width= 100;
    mbc.MappingName = "Col2";

    //ここでイベントの登録
    mbc.BoolChecked += new BoolCheckedEventHandler(boolChanged);
    dgt.GridColumnStyles.Add(mbc);

    dataGrid1.TableStyles.Add(dgt);



こんな感じです。。
参考になればいいのですが。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-05-07 01:58
引用:

00_Numberさんの書き込み (2004-05-06 02:13) より:

実は自分はオーバーライドを行ったメソッドの拡張を今までに少ししかやった事がなく、どういった理屈で今回の教えて頂いた処理も実現出来るのかが今ひとつ理解出来ていません。
今までにも.NET既存のメソッドのオーバーライドについては調べようとはしたのですが、まわりに詳しい者がおらず何を調べれば拡張の手順や方法論を理解出来るのかがさっぱりでして。。。



申し訳ないのですが、VB.NETは全然判らないので。。
参考になるサイトとしては、GotDotNetのサイトにあるVB.NETのMessageBoardとかUsersSampleのサイトぐらいしか思い付きません。。ごめんなさい。
ただ、VB.NETに関しては書籍が多く出版されているような感じですので、それらを参考にしてもいいのではないかなぁとは思います。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
00_Number
常連さん
会議室デビュー日: 2003/11/04
投稿数: 37
投稿日時: 2004-05-11 23:19
Jubeiさん御回答ありがとうございます。
お返事が遅くなってしまい申し訳ありません。

現在時間がなかなか取れずに教えて頂いた方法もまだキチンと実現出来ていない状況ですが、引き続き調べを進めていこうと思います。

教えて頂いたMessageBoardとUsersSample良さそうですね。英語サイトなので自分にはちょっと気合が要りそうですが。
やはり書籍で勉強するのが一番なんですね。精進します。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)