C# ReoGrid 条件付き書式の設定方法について

タグの編集
投稿者 えんぴー  (社会人) 投稿日時 2024/5/30 16:06:13
以下の条件で条件付き書式を付けたいと思います。

A列は特定文言のみ(果物、野菜、肉など…)
B列は1~25の数値のみ
C~E列も特定文言のみ(りんご、バナナ、キャベツ、ピーマン、豚など)

セルの入力方式としては
・ほかのExcelなどからコピペOK
・セルが変化したタイミングでセルを精査
 →おかしなものがあれば背景色を赤にしたりする
・エラーが全部解消するまでは、「確定」のボタンを押せない

みたいにしようと思っています。
「CellDataChanged」が良いと見たので、
フォームのロード時に以下追記しました。


private void Form1_Load(object sender, EventArgs e)
   {
  sheet = ReoGrid1.CurrentWorksheet;
  sheet.CellDataChanged += (s, ex) => {
      CellDataChangeCheck(s, ex);
  };



  public void CellDataChangeCheck(object sender, ここが分からない)
   {
//eのイベント名をどうしたらいいか分からない
  }



CellAfterEditEventArgs?

変化のあったセル位置をすべて取得し、
こちらで定義しているものと違えば背景をピンクに
合っていれば真っ白なままなどにしたいと思っています。

とりあえず変更のあったすべての位置だけでも取得できれば良いと思うのですが
eのイベント名?イベントハンドラー?を何にしたら良いか分かりません。

Mouse_Clickなど、既に定義されているイベントは
ダブルクリックで自動作成されるため問題なく作れています。

どういうイベント名?にしたらいいのでしょう。
調べ方も良く分かりません。

とりえあず以下のようにしてみたのですが、
この内容で不具合等考えられますでしょうか?

        public void CellDataChangeCheck(object sender, CellEventArgs e)
        {
            if (sheet.SelectionRange.Row != 0)
            {
                switch (sheet.SelectionRange.Col)
                {
                    case 0:
                        Console.WriteLine("A");
                        break;
                    case 1:
                        Console.WriteLine("B");
                        break;
                    case 2:
                        Console.WriteLine("C");
                        break;
                    case 3:
                        Console.WriteLine("D");
                        break;
                    case 4:
                        Console.WriteLine("E");
                        break;
                    case 5:
                        Console.WriteLine("F");
                        break;
                    default:
                        break;
                }
            }
        }



投稿者 KOZ  (社会人) 投稿日時 2024/5/31 09:34:09
イベントハンドラの作り方は、ここにありますよ。
https://www.umayadia.com/CSNyumon/BEGIN4.htm
投稿者 とくま  (社会人) 投稿日時 2024/5/31 12:11:01
>Mouse_Clickなど、既に定義されているイベントは
>ダブルクリックで自動作成されるため問題なく作れています。
ダブルクリックで、自動生成されるイベントは、既に定義されているイベントの中でも
一番よく使われると予想されるイベントが、デフォルトで1つ決められています。
ただし、メーカーさんが既にコーディングされている「CellDataChanged」イベント
なども既に定義されているイベントであり、自動生成可能です。
この方法が KOZ さん御紹介の入門編ページで解説されています。

デザイナ画面からイベントの自動生成機能を使うと、他のデザイン情報とともに
イベントの生成コードが、フォーム名.Designer.cs ファイルに記述されます。
このファイルはデザイナ画面と密接に関係しているので、自分で編集はしない方が
良いのですが、生成されるコードは大変参考になりますので、ソリューション
エクスプローラから選択して、コードを見てみると良いでしょう。

現在えんぴー さんが自分でプログラムしようとしている
>  sheet = ReoGrid1.CurrentWorksheet;
>  sheet.CellDataChanged += (s, ex) => {
>      CellDataChangeCheck(s, ex);
このコードも、デザイナ画面から、デフォルトのsheetに対してイベント生成コードが
自動作成できるのではないでしょうか?
しばらくは、このデザイン画面からの自動生成機能に頼ることをお勧めします。
自分で考える必要が無く、便利だと思います。

>eのイベント名?イベントハンドラー?を何にしたら良いか分かりません。
ぶっちゃけ、関数名も引数名も、ただの関数名や変数名なので、何にでも変更できます。
既存のプログラムされたイベントの引数の、個数と型名が一致していれば大丈夫です。
自動生成された
private void Form1_Load(object sender, EventArgs e)

private void ロードイベント(object フォームだよ, EventArgs イベント引数だよ)
に変更しても動作させることは可能です。※デザイナ画面側も変更する必要あり

ただし、やはり、既存のイベントに関してはデフォルトの名称にしておいた方が、
他の人が見たときに理解しやすいです。掲示板で質問するときも、説明量が少なく
なります。サンプルコードもコピペのみで調整が必要ありません。

今後、プログラム実行中にsheetを新しく増やすとか、切り替えるみたいな
デフォルトのデザイナ画面だけでカバーしきれないプログラムが必要になったときに
自分でイベント生成コードを書くことに挑戦されたら良いと思います。
まずは、自動生成でどこまでできるか?どんなコードが生成されるか?を
覚えると良いと思います。
投稿者 えんぴー  (社会人) 投稿日時 2024/5/31 13:08:03
KOZ様
回答ありがとうございます。
読みます!

とくま様
ダブルクリック生成されるイベント一覧?を確認したのですが
「CellDataChanged」はありませんでした。
そのため、手動でイベントを追記しております。


sheet = ReoGrid1.CurrentWorksheet;
sheet.CellDataChanged += (s, ex) => {
CellDataChangeCheck(s, ex);


まだCellDataChangeCheckメソッド?を作っていない状態でカーソルを持っていったら
「object sender, CellEventArgs e」と表示されたので、その通りに作ったところ
問題なく動作するようになりました!


        public void CellDataChangeCheck(object sender, CellEventArgs e)
        {
                string CellData = e.Cell.Data.ToString();//変更があった値
       }



ありがとうございました!