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

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

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

Re[4]: varidateの制御を教えてください。


(過去ログ 102 を表示中)

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

■60984 / inTopicNo.1)  varidateの制御を教えてください。
  
□投稿者/ 裕猫 (241回)-(2011/07/28(Thu) 11:58:35)

分類:[C#] 

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

Validateのコントロールが思うようにできなくて困っています。
namespace VD
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) { this.ProcessTabKey(!e.Shift); e.Handled = true; }
        }

        private void textBox1_Validated(object sender, EventArgs e)
        {
            textBox1.Text = "textbox1";
        }

        private void textBox2_Validated(object sender, EventArgs e)
        {
            textBox1.Text = "textbox2";
        }

        private void textBox3_Validated(object sender, EventArgs e)
        {
            textBox1.Text = "textbox3";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("button1");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("button2");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.AutoValidate = AutoValidate.Disable;
            MessageBox.Show("button3");
            this.AutoValidate = AutoValidate.EnablePreventFocusChange;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.AutoValidate = AutoValidate.Disable;
            MessageBox.Show("button4");
            this.AutoValidate = AutoValidate.EnablePreventFocusChange;
        }
    }

button3,4のcausesvalidate=falseはプロパティで設定してあります。

textbox1〜3までvalidateを設定しbutton1,2はvalidate実行 button3,4ではvaridateを実行しないようにしています。
textbox1→button1→textbox2→textbox3とクリックしていくと
 textbox1に文字表示、メッセージボックス表示、textbox2に文字表示でいいのですが
textbox1→button3→textbox2→textbox3とクリックしていくと
 textbox1に文字表示なし、メッセージボックス表示、textbox1に文字表示、textbox2に文字表示となってしまい
 textbox1に文字表示なし、メッセージボックス表示、textbox2に文字表示となりません。
 textbox1に文字表示なし、メッセージボックス表示、textbox2に文字表示の動きにするにはどうしたらできるでしょう?。
ご指導よろしくお願いいたします。

引用返信 編集キー/
■60985 / inTopicNo.2)  Re[1]: varidateの制御を教えてください。
□投稿者/ shu (885回)-(2011/07/28(Thu) 12:32:18)
No60984 (裕猫 さん) に返信

以下のプログラムにて
textBox1にフォーカスがある状態からbutton1をマウスでクリックした場合、

textBox1_Validated
button1_MouseDown
button1_Click

と表示されます。つまりValidatedはMouseDownより前に動いています。
なので、MouseDownより後のClickでAutoValidateの制御をしても意味がありません。
Validatedが動いたときのthis.ActiveControlはbutton1になっているのでその辺で判断すると
よいかもしれません。

		public Form1()
		{
			InitializeComponent();
			textBox1.Validated += new EventHandler(textBox1_Validated);
			button1.MouseDown += new MouseEventHandler(button1_MouseDown);
			button1.Click += new EventHandler(button1_Click);
		}

		void textBox1_Validated(object sender, EventArgs e)
		{
			Console.WriteLine("textBox1_Validated");
		}

		void button1_Click(object sender, EventArgs e)
		{
			Console.WriteLine("button1_Click");
		}

		void button1_MouseDown(object sender, MouseEventArgs e)
		{
			Console.WriteLine("button1_MouseDown");
		}

引用返信 編集キー/
■60995 / inTopicNo.3)  Re[2]: varidateの制御を教えてください。
□投稿者/ 裕猫 (242回)-(2011/07/28(Thu) 16:47:07)
No60985 (shu さん) に返信
> と表示されます。つまりValidatedはMouseDownより前に動いています。
> なので、MouseDownより後のClickでAutoValidateの制御をしても意味がありません。
> Validatedが動いたときのthis.ActiveControlはbutton1になっているのでその辺で判断すると
> よいかもしれません。
アドバイスありがとうございます。こんな風に書き換えてみました。
private bool ContCheck()
{
MessageBox.Show(this.ActiveControl.Name);
switch (this.ActiveControl.Name)
{
case "button3":
case "button4":
return false;
break;
default:
return true;
break;
}
}

private void textBox1_Validated(object sender, EventArgs e)
{
if (ContCheck() == false) { return; }
textBox1.Text = "textbox1";
}

private void button3_Click(object sender, EventArgs e)
{
MessageBox.Show("button3");
}

実行してみましたが、button3では実行完了しているはずのtextbox1_validatedがbutton3→textbox2クリック時に動きます。
どこかをクリックするとその前に実行されたvalidateを実行するようです。どうしたらvalidateの動作をクリアできないか困っています。
引用返信 編集キー/
■61009 / inTopicNo.4)  Re[3]: varidateの制御を教えてください。
□投稿者/ shu (889回)-(2011/07/29(Fri) 09:41:52)
No60995 (裕猫 さん) に返信

> private bool ContCheck()
> {
> MessageBox.Show(this.ActiveControl.Name);
> switch (this.ActiveControl.Name)
不必要なメッセージボックス表示はイベントの実行を妨げるので
別の方法で確認されたほうがよいと思います。

> 実行してみましたが、button3では実行完了しているはずのtextbox1_validatedがbutton3→textbox2クリック時に動きます。
> どこかをクリックするとその前に実行されたvalidateを実行するようです。どうしたらvalidateの動作をクリアできないか困っています。
butto3クリックでtextBox1上にフォーカスが残ったままになっているとかないですか?Validatingによるキャンセルはされていますか?
引用返信 編集キー/
■61011 / inTopicNo.5)  Re[4]: varidateの制御を教えてください。
□投稿者/ 裕猫 (243回)-(2011/07/29(Fri) 10:41:12)
No61009 (shu さん) に返信
先のプログラムで動作させることができました。causesValidationをプロパティでfalseにしていたのが原因でした。trueにしてうまく動かすことができました。
どうもありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -