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

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

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

Re[16]: UserControlとValidatingについて [1]


(過去ログ 94 を表示中)

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

■56297 / inTopicNo.21)  Re[14]: UserControlとValidatingについて
  
□投稿者/ KK (14回)-(2011/01/08(Sat) 11:57:31)
よねKEN 様
> 検索して見つけた情報を元にして追加検証したものです。
いろいろ調べていただいて、本当ありがとうございます。

>●参考にした情報
>↓同じ現象と思われる質問が別掲示板で過去にあった。でも未解決
>ユーザコントールのNETのバグ? - Insider .NET会議室
>http://ap.atmarkit.co.jp/bbs/core/fdotnet/17010
自分なりに、教えて頂いた情報をもとにテストしてみました。

>> UserControl11.CausesValidation = False
> これが、ユーザー コントロールの中のコントロールにまで伝播するかどうかわかりませんが、ユーザー コントロールへフォーカスが移動することによる検証処理は行わないので、
>> 3.ユーザコントロールの時は、最初の1回目のボタンクリックだけは期待通りになりますが
>ここがすでにおかしいように思います。
>テキストボックスの Validating イベントも発生していないのでしょうか。ブレーク ポイントを張って、確認ししてください。NG の方へ流れていないのだと思います。

掲示板で、Jitta様がおっしゃられている内容の問題なのかなと感じましたが、
自分のテストの仕方がまずかったのでしょうか。

> 継承元がUserControlでないといけない理由が特になければ、継承元をPanelにしてはどうでしょうか。
今回のようなTextBoxの変更以外にも、別の問題が発生する可能性もありますね。
ただ、以下のようなことができるのがUserControlという頭でしたので・・・。
Panelを変更して以下のようなことも可能なのでしょうか。
再度調べてみます。

・複数のコントロールを1つにまとめる。
・デザイナでレイアウト調整
・共通コントロールとして利用。
 

引用返信 編集キー/
■56299 / inTopicNo.22)  Re[15]: UserControlとValidatingについて
□投稿者/ KK (15回)-(2011/01/08(Sat) 17:26:25)
>todo様 shu様 よねKEN様

皆さんに教えていただいたことを、
参考にいろいろ確認してみたところ以下のことがわかりました。

A(ContainerControlを継承したControl上に設置されたControl)から、
B(別のContainerControlを継承したAとは別のControl上に設置されたTextBox)に左クリックで、
フォーカスを移動するとAのValidatingイベントが1〜2回発生するようです。
(Validatingイベントキャンセル時のみ)

例)Form上に設置されたTextBox、ComboBoxからSplitContainer、UserControl上のTextBoxに
   クリックでフォーカスを移すとValidatingイベントが1〜2回発生。

※すべてのControlを確認できているわけでは、ありませんのでご注意を。

で、
以下のように 作成してみました。
***************************************************************************************************
Module Module1
    Public IsMouseDown As Boolean = False
    Public Canceled As Boolean = False
End Module

Public Class TextBoxEx
    Inherits TextBox

    Private Const WM_LBUTTONDOWN As Integer = &H201
    Private Const WM_LBUTTONUP As Integer = &H202

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        If m.Msg = WM_LBUTTONDOWN Then
            IsMouseDown = True
            Canceled = False
        End If

        MyBase.WndProc(m)

        If m.Msg = WM_LBUTTONUP Then
            IsMouseDown = False
        End If

    End Sub

    Protected Overrides Sub OnValidating(ByVal e As System.ComponentModel.CancelEventArgs)

        If IsMouseDown And canceled Then
            e.Cancel = True
        Else
            MyBase.OnValidating(e)
            Canceled = e.Cancel
        End If

    End Sub

End Class

----------------------------------------
Validatingのチェックが必要になるコントロールに
OnValidatingの修正が必要。

Public Class CheckBoxEx
    Inherits CheckBox

    Protected Overrides Sub OnValidating(ByVal e As System.ComponentModel.CancelEventArgs)
        If IsMouseDown And Canceled Then
            e.Cancel = True
        Else
            MyBase.OnValidating(e)
            Canceled = e.Cancel
        End If
    End Sub
End Class

もしくは、フォーム上に配置されたControlのValidatingイベントに
上記のような条件でチェックを回避する処理が必要かと思います。
----------------------------------------
***************************************************************************************************


>todo様 shu様 よねKEN様
皆様 色々教えていただき、本当にありがとうございます。

引用返信 編集キー/
■56315 / inTopicNo.23)  Re[15]: UserControlとValidatingについて
□投稿者/ よねKEN (660回)-(2011/01/09(Sun) 14:28:53)
No56297 (KK さん) に返信
> ・複数のコントロールを1つにまとめる。

まとめるだけなら、どんなControlでも可能です。
(Control.Controlsプロパティがあるから)

> ・デザイナでレイアウト調整

お使いになっているVisul Studioのバージョン&エディションで検証しての確認が必要ですが、試した範囲ではできないようです。
(VS2008でカスタムコントロールを選んでみましたが、複合コントロールを作るようにはデザイナが想定されていないようです)

> ・共通コントロールとして利用。

プログラムの動作上の問題はありません。

共通で利用するタイプのコントロールを作成する手段にはユーザコントロールとカスタムコントロールがあり、
UserControl以外のコントロールを継承して作るやり方がカスタムコントロールです。

先も書きましたが、カスタムコントロールに対するデザイナのサポートがないようなので、
コードエディタで手書きする必要があるようです。

引用返信 編集キー/
■56340 / inTopicNo.24)  Re[16]: UserControlとValidatingについて
□投稿者/ KK (16回)-(2011/01/11(Tue) 11:04:48)
よねKEN 様
返事が遅くなり、申し訳ありませんでした。

色々ご確認いただき、本当にありがとうございます。
自分でも調べてましたが、デザイナ上での変更は難しそうでした。

>先も書きましたが、カスタムコントロールに対するデザイナのサポートがないようなので、
>コードエディタで手書きする必要があるようです。
今回はtodo様の方法で、作成していこうと思います。

※ContainerControlを継承したControl上でも利用できそうですので。

>todo様 shu様 よねKEN様
皆様 色々教えていただき、本当にありがとうございました。
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

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

管理者用

- Child Tree -