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

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

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

Re[5]: validateの使い方


(過去ログ 101 を表示中)

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

■60352 / inTopicNo.1)  validateの使い方
  
□投稿者/ 裕猫 (229回)-(2011/06/29(Wed) 11:57:14)

分類:[C#] 

開発環境
OS: WindowsXP SP3
言語: VisualStudio2008 C#

validateの使い方で困っています。今下記のようなプログラムでテストしています。
namespace Vali2
{
    public partial class Form1 : Form
    {
        private string RD;
        public Form1()
        {
            InitializeComponent();
        }

        private void textBox1_Validated(object sender, EventArgs e)
        {
            label2.Text = "textBox1";
            //MessageBox.Show("textBox1");
        }

        private void textBox2_Validated(object sender, EventArgs e)
        {
            label2.Text = "textBox2";
            MessageBox.Show("textBox2");
        }

        private void textBox3_Validated(object sender, EventArgs e)
        {
            label2.Text = "textBox3";
            MessageBox.Show("textBox3");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "button1";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            label1.Text = "button2";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            label1.Text = "button3";
        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
このプログラムだとtextBox1にフォーカスしてからbutton1をマウスでクリックしたときlabel2にtextBox1、label1に"button1"
が正しく表示されるのですがtextBox2やtextBox3にフォーカスしてからbuttonをクリックするとメッセージボックスが出た後
okボタンでメッセージボックスを消すとbutton_Click動作をしてくれません。(label1の文字が変わらない)メッセージボックス
出た後でもbutton_Click動作をさせるにはどうしたらいいでしょう?アドバイスお願いいたします。

引用返信 編集キー/
■60354 / inTopicNo.2)  Re[1]: validateの使い方
□投稿者/ shu (813回)-(2011/06/29(Wed) 12:29:20)
No60352 (裕猫 さん) に返信

ボタンのとこでマウスダウンする直前でフォーカスが離れるので
そこでValidating,Validatedが走ってしまいます。つまりメッセージを表示すると
ボタンのクリック状態になる前にメッセージボックスにフォーカスが移るので
ボタンをクリック出来ていません。ValidatingでCancelのときのみメッセージを出すのがよいと思います。


引用返信 編集キー/
■60356 / inTopicNo.3)  Re[2]: validateの使い方
□投稿者/ 裕猫 (230回)-(2011/06/29(Wed) 14:43:49)
No60354 (shu さん) に返信
> ボタンのとこでマウスダウンする直前でフォーカスが離れるので
> そこでValidating,Validatedが走ってしまいます。つまりメッセージを表示すると
> ボタンのクリック状態になる前にメッセージボックスにフォーカスが移るので
> ボタンをクリック出来ていません。ValidatingでCancelのときのみメッセージを出すのがよいと思います。
>
validateでは正しくてもまちがっていても必ずメッセージボックスを出す必要があるものがあります。なのでvalidateを使わないですむよう、取り扱いは必ずリターンキーを押すようにとしておいたのですが、客先の使用者がそれを無視してマウス移動などを使うため、validateを使う必要に迫られました。そこで問題になったのがメッセージボックスを出すvalidateを組み込んだテキストボックスから登録ボタンをクリックしたときに登録動作がおきないという現象です。原因はshuさんの指摘のとうりなんですが、これではボタンが効かないとクレームをつけられてしまいます。validateを使わなくてもいいのですがフォーカスがボタンに移動したときメッセージボックスを出し、メッセージボックスを閉じたときにボタンの動作をさせるいい方法はないでしょうか?
引用返信 編集キー/
■60357 / inTopicNo.4)  Re[3]: validateの使い方
□投稿者/ shu (815回)-(2011/06/29(Wed) 14:57:12)
No60356 (裕猫 さん) に返信

ValidatingでCancel時はメッセージを表示し
Cancelでないときはdelegate変数に処理を設定しておいて
後の処理でそのdelegateを実行するのはどうでしょう?
Enterイベント、Clickイベント時に変数の内容を確認するなど。
引用返信 編集キー/
■60358 / inTopicNo.5)  Re[3]: validateの使い方
□投稿者/ つんくん (1回)-(2011/06/29(Wed) 15:10:19)
> validateでは正しくてもまちがっていても必ずメッセージボックスを出す必要があるものがあります。
正しい場合にメッセージボックスを出すのはvalidateの正しい使い方とは言えません。
(正しい場合にメッセージボックスを出すのはどのような時でしょうか、想像できません。
フォーカスが外れるたびにメッセージが出るなんて、うっとしいと思うのですが?)

> validateを使わないですむよう、取り扱いは必ずリターンキーを押すようにとしておいたのですが、
マウスが操作できる以上、マウスで操作したくなるのは当然だと思います。

今回のような応急処置では、今後の改修が発生した時に不具合の発生するリスクが高くなるように思いますので、
設計を見直すことも必要かと思います。
引用返信 編集キー/
■60359 / inTopicNo.6)  Re[4]: validateの使い方
□投稿者/ shu (816回)-(2011/06/29(Wed) 15:17:11)
VB.NETですがサンプルです。
C#2008なら似たようなことは出来ると思います。

    Private m_act As Action = Nothing

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        If m_act IsNot Nothing Then
            m_act()
        End If
        m_act = Nothing
        Label1.Text = "Button1_Click"
    End Sub

    Private Sub TextBox1_Enter(sender As Object, e As System.EventArgs) Handles TextBox1.Enter
        If m_act IsNot Nothing Then
            m_act()
        End If
        m_act = Nothing
        Label1.Text = ""
    End Sub

    Private Sub TextBox2_Enter(sender As Object, e As System.EventArgs) Handles TextBox2.Enter
        If m_act IsNot Nothing Then
            m_act()
        End If
        m_act = Nothing
        Label1.Text = ""
    End Sub

    Private Sub TextBox1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
        If TextBox1.Text = "1" Then
            MessageBox.Show("TextBox1_Validating Cancel", "TextBox1_Validating")
            e.Cancel = True
        Else
            m_act = Sub()
                        MessageBox.Show("TextBox1_Validating Accepted", "TextBox1_Validating")
                    End Sub
        End If
    End Sub

引用返信 編集キー/
■60376 / inTopicNo.7)  Re[4]: validateの使い方
□投稿者/ 裕猫 (231回)-(2011/06/30(Thu) 12:54:01)
No60358 (つんくん さん) に返信
> 正しい場合にメッセージボックスを出すのはvalidateの正しい使い方とは言えません。
> (正しい場合にメッセージボックスを出すのはどのような時でしょうか、想像できません。
> フォーカスが外れるたびにメッセージが出るなんて、うっとしいと思うのですが?)
>
>>validateを使わないですむよう、取り扱いは必ずリターンキーを押すようにとしておいたのですが、
> マウスが操作できる以上、マウスで操作したくなるのは当然だと思います。
>
> 今回のような応急処置では、今後の改修が発生した時に不具合の発生するリスクが高くなるように思いますので、
> 設計を見直すことも必要かと思います。
説明が悪かったようです。 組み合わせを登録するプログラムで製品台帳から品番があるかどうかを確認し、あるかないかをメッセージボックスで知らせる動作を製品番号を入力するテキストボックスのvalidateで実行します。前はキープレスでエンターが押されたときに確認したのですが、エンターを押さずに登録ボタンをクリックする人がいて未登録の品番が登録されて困るので、validateを使うことになりました。が、今度はメッセージボックスが出るので登録動作がされず、作業者は登録できたものと思いあとで登録できていないとクレームされて困っている状況です。そんなわけでどうしたらチェック動作もして、ボタンクリック動作もさせたらいいか調べています。
引用返信 編集キー/
■60377 / inTopicNo.8)  Re[5]: validateの使い方
□投稿者/ 裕猫 (232回)-(2011/06/30(Thu) 12:55:58)
No60359 (shu さん) に返信
> VB.NETですがサンプルです。
> C#2008なら似たようなことは出来ると思います。
サンプルありがとうございます。緊急に社内パソコンの修理が入ってしまったので後日試してみます。ありがとうございました。
引用返信 編集キー/
■60378 / inTopicNo.9)  Re[5]: validateの使い方
□投稿者/ つんくん (2回)-(2011/06/30(Thu) 13:20:12)
> あるかないかをメッセージボックスで知らせる動作を製品番号を入力するテキストボックスのvalidateで実行します。

文章としてのメッセージをユーザーに見せたいのであればメッセージボックスが必要になるかも知れませんが、
「あるかないか」だけの情報なら、ある場合はメッセージボックスは要らないのでは?
ラベルに「登録あり」とか「登録なし」とか表示する程度では不十分なのでしょうか?

validateイベントの処理を行うのに、他ののコントロールのイベントまで考慮しなければならないような設計は、
後に改修を行うとき、バグの原因になる可能性がありますよ。
引用返信 編集キー/
■60398 / inTopicNo.10)  Re[5]: validateの使い方
□投稿者/ 裕猫 (233回)-(2011/07/01(Fri) 15:17:39)
No60359 (shu さん) に返信
確実に実行するにはこの方法しかないですね。しかしvalidateの数が多いとどのvalidateを実行するかの判別がややこしくなってしまいますね。つんくんさんの言うように再度設計から考え直してやってみます。ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -