C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: datagridviewの列毎の入力制限


(過去ログ 50 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■27467 / inTopicNo.1)  datagridviewの列毎の入力制限
  
□投稿者/ 見習いPG (7回)-(2008/11/06(Thu) 21:59:21)

分類:[C#] 

お世話になっております。

環境:C# 2005 VisualStadio

タイトルそのままなんですが、datagirdviewの列毎(セル)の入力制限で詰まっています。
検索してみると、それなりに情報は出てくるのですが、自分の環境に合わず力量もまだまだなのか、
試行錯誤してみても、なかなか思い通りの動作ができません。

列毎のIMEモードの設定はできるのですが、私が今回やりたい事は、
datagridviewの列毎に「数字のみ」「ひらがなのみ」入力可能であるような制限を行いたいのです。

おそらく、ここに書いてあることが最も答えに近いと思うのですが…、
http://dobon.net/vb/dotnet/datagrid/cellkeypress.html

周りに頼れる人がいないので、もし宜しければご教授下さい。
お願いします orz
引用返信 編集キー/
■27470 / inTopicNo.2)  Re[1]: datagridviewの列毎の入力制限
□投稿者/ ロック (135回)-(2008/11/07(Fri) 09:11:01)
2008/11/07(Fri) 09:22:25 編集(投稿者)

↓こっちの方法では、どうですか?
http://dobon.net/vb/dotnet/datagridview/cellvalidating.html

この方法だと、貼り付けとかされた場合にも対応できるかと思います。
が、「表示用の書式指定済みの値」とあるので用途によっては
別な問題が発生するかもしれません

#書き忘れました、追記です
エラーチェックには正規表現を使うと楽かも
数字だけなら、こんな感じかな?(未入力もNG)
if(!System.Text.RegularExpressions.Regex.IsMatch(チェック文字, "^[0-9]+$")){

引用返信 編集キー/
■27484 / inTopicNo.3)  Re[2]: datagridviewの列毎の入力制限
□投稿者/ 見習いPG (8回)-(2008/11/07(Fri) 13:07:12)
ロックさん>
返答ありがとうございます。
早速試してみて動作を確認させて頂きました。
確かに数字のみの入力制限ができましたが、私の求めているモノと若干異なるモノのようでした。

私がやりたい動作を詳しく説明しますと、
datagridviewのある列のセルに、最初から入力可能なモノが数字のみで、数字キー以外は反応すらしないというモノで、
数値が入力されたあとカンマ編集を施したいのです。
説明が下手で本当に申し訳ありません。

実は昨日、最初に貼ったリンク先のプログラムをいじっていて、一度動作を実現できたのですが、
ソースを消してしまい、後でまたやろうとしたら出来なくなってしまったという orz
引用返信 編集キー/
■27485 / inTopicNo.4)  Re[3]: datagridviewの列毎の入力制限
□投稿者/ ロック (136回)-(2008/11/07(Fri) 13:14:54)
では、やはりこっちですね・・
http://dobon.net/vb/dotnet/datagridview/textboxevent.html

ただ、コピペが気になります。
その辺は、とりあえず置いといて(汗)
上記を参考にやってみては、いかがでしょうか
引用返信 編集キー/
■27492 / inTopicNo.5)  Re[4]: datagridviewの列毎の入力制限
□投稿者/ 見習いPG (9回)-(2008/11/07(Fri) 15:24:32)
ロックさん>
私が昨日見ていた参考ページはそこでした!
何か勘違いして、昨日とは別の参考ページを見ていたようです。
コピペはなるべくしないように心がけていますが、実力不足ゆえに
時間がないときは、参考ページに頼ってしまいがちになってしまいます orz
しかし、書いてあることはなるべく理解していくつもりなので、内容はコピペでも、
このようなやり方があるんだと技をしっかり習得していきたいと考えています。

とにかく、もう一度参考ページを見ていじってみます。
教えて頂きありがとうございました。

引用返信 編集キー/
■27498 / inTopicNo.6)  Re[5]: datagridviewの列毎の入力制限
□投稿者/ 見習いPG (10回)-(2008/11/07(Fri) 17:00:02)
解決済み付け忘れました。
すいません。
解決済み
引用返信 編集キー/
■27500 / inTopicNo.7)  Re[6]: datagridviewの列毎の入力制限
□投稿者/ 見習いPG (11回)-(2008/11/08(Sat) 07:43:39)
2008/11/08(Sat) 07:44:44 編集(投稿者)
ほぼ動作は達成できたのですが、1つ問題が発覚してしまいました。
datagridviewに"text","text2","text3"という列を用意して、列毎に色々制限をかけようとしていまして、
以下のようなコーディングを行ったのですが、

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            //表示されているコントロールがDataGridViewTextBoxEditingControlか調べる
            if (e.Control is DataGridViewTextBoxEditingControl)
            {
                DataGridView dgv = (DataGridView)sender;

                //編集のために表示されているコントロールを取得
                DataGridViewTextBoxEditingControl tb =
                    (DataGridViewTextBoxEditingControl)e.Control;

                //イベントハンドラを削除(何度も追加されるのを防ぐ為)
                tb.KeyPress -= new KeyPressEventHandler(tb_KeyPress);
                tb.TextChanged -= new EventHandler(tb_TextChanged);

                //列によってIMEのモードを変更する
                switch (dgv.CurrentCell.OwningColumn.Name)
                {
                    case "text":
                        //KeyPressイベントハンドラを追加   DOBON セルが編集中の時にキーイベントを捕捉する(参考)
                        tb.KeyPress += new KeyPressEventHandler(tb_KeyPress);
                        tb.TextChanged += new EventHandler(tb_TextChanged);
                        break;

                    case "text2":
                        tb.ImeMode = ImeMode.AlphaFull;
                        break;

                    case "text3":
                        tb.ImeMode = ImeMode.Katakana;
                        break;

                    default:
                        MessageBox.Show("テスト");
                        break;
                }
            }
        }

        private void tb_KeyPress(object sender, KeyPressEventArgs e)
        {
            //数字しか入力できないようにする
            if (e.KeyChar < '0' || e.KeyChar > '9')
            {
                e.Handled = true;
            }
        }

        private void tb_TextChanged(object sender, EventArgs e)
        {
            MessageBox.Show("イベント発生");
        }

text列からtext2列に移って入力したとき、1回目の入力時、tb_TextChangedイベントが発生してしまいます。
tb_KeyPressも発生しているようで、1回目の入力時、数字のみではないのですが半角英数字が入ってしまいます。
2回目からはImeModeで指定した通り、全角英数字指定になり(入力制限は行っていませんが)、
tb_TextChangedイベントも発生しません。
text2列からtext3列に移って入力したときも同様な現象が起こり、1回目に全角英数字が入ってしまい、
2回目からはちゃんとカタカナ指定になります。

ちゃんと1回目から、アクティブ中の列に指定した通りに入力できるようにしたいのです。
イベントのタイミングの問題なのかなと思い、色々試してみましたが、思うように動作せず。
参考になるページ、どうすればよいのかご教授ください。お願いします orz

引用返信 編集キー/
■27506 / inTopicNo.8)  Re[7]: datagridviewの列毎の入力制限
□投稿者/ .SHO (7回)-(2008/11/08(Sat) 14:11:52)
DataGridViewは、内部でエディトコントロールを使いまわすので
このソースのタイミングでイベントハンドラを削除したのでは遅すぎます。

また、EditingControlShowingは、編集モードに入った時点で呼ばれるわけですが
編集モードに入るトリガがキー入力なので、EditingControlShowingが呼ばれた時点では
最初の1文字は既にIMEを経由して入力されてしまっているので、そのような結果になります。

ご希望の処理を実現するには、セルを移動した時点でDataGridViewが内部で使用する
エディットコントールに対してIMEのモード設定をする必要があるのですが
実際にそれが実現可能かはわかりません。すいません。。。
引用返信 編集キー/
■27517 / inTopicNo.9)  Re[8]: datagridviewの列毎の入力制限
□投稿者/ 見習いPG (12回)-(2008/11/08(Sat) 19:37:12)
2008/11/08(Sat) 19:44:03 編集(投稿者)

.SHOさん>
返答ありがとうございます。
なるほど。私のような脳でも非常に分かりやすく動作が理解できた気がします。
助言を元に、セルが移動したときに即編集モードに入ればいいのかなと思い、
以下のコードを加えてみた所、1回目の入力時の問題は解消されました。

private void dataGridView1_CellLeave(object sender, DataGridViewCellEventArgs e)
{
//即編集モードに入る
this.dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
}

しかし、コピー&ペースト機能も実現しないといけないため、
これでは不都合が生じることが発覚しました orz
引用返信 編集キー/
■27573 / inTopicNo.10)  Re[9]: datagridviewの列毎の入力制限
□投稿者/ .SHO (10回)-(2008/11/10(Mon) 12:59:53)
No27517 (見習いPG さん) に返信

> しかし、コピー&ペースト機能も実現しないといけないため、
> これでは不都合が生じることが発覚しました orz

どのような不都合が生じるのかがわからなかったのですが
もし、コピー&ペーストでも入力制限をしたいということでしたら
根本的に全体の処理を見直さないとダメですね。。。
引用返信 編集キー/
■27587 / inTopicNo.11)  Re[10]: datagridviewの列毎の入力制限
□投稿者/ 見習いPG (13回)-(2008/11/10(Mon) 18:12:34)
.SHOさん>
おそらく私が求めているモノを完璧に実装するなら、
やはり全体の処理を見直す必要があるようです。
しかし、他の部分の処理もまだまだ残っており、
私的には現在のプログラムでも目標の8割は実装できていると思っているので、
今回はこの辺りで〆て次に進みたいと思います。
ちなみに、このプログラムは学校の自由課題用のものです。

また、何かありましたら宜しくお願い致します。
ありがとうございました。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -