- - PR -
カレンダーを使用した日付入力コントロールを自作したい
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-07-04 15:59
Parent がフォームそのものを表す場合はこれでよいかも知れませんが、 フォーム上にパネルを配置して、その上にこのコントロールを配置すると、 Parent はそのパネルを表すことになりますから、 フォームを参照するには Parent.Parent と書かなくてはなりません。 したがってこの実装ですと、こういうケースの場合に 「パネル内をクリックすれば動作するけど、パネル外をクリックすれば動作しない」 ということになると思います。 じゃんぬさんのコメント中にある「Parent を追って」というのは、そういう意味だと思います。 少し話は違いますが、そもそもユーザーコントロールで Parent のイベントをハンドルするという設計が少々疑問です。 ユーザーコントロールはそれが置かれているコンテナに依存すべきではないと思います。 というわけで、私ならイシバシさんのように実装すると思います。 | ||||||||
|
投稿日時: 2007-07-04 16:13
KIさんこんにちは。
考えてみれば確かにそうですね、、、浅はかでした。 勉強になりました。 ありがとうございました。 | ||||||||
|
投稿日時: 2007-07-04 16:35
KIさん、ご回答ありがとうございます。大変勉強になりました。
アドバイスどおり、イシバシさんの方法で作成してみようと思います。 シュリさん、ご回答ありがとうございます。大変勉強になりました。 そもそもフォームのデザインでコントロールを配置しなくても コード内で宣言してあげる事で表示する事も可能だという事も知らなかった私です。 そういう方法がある事を知ったのもすごく勉強になりました。 お2人ともありがとうございました。 | ||||||||
|
投稿日時: 2007-07-04 18:35
MonthCalendarのサイズが変わらないとは限りません。 フォントサイズやデスクトップのデザイン、 .Netのバグフィックスなどでも変わる可能性があります。 ですので、 Form.AutoSize = true From.AutoSizeMode = GrowAndShrink として自動で計算させるのがよいと思います。 | ||||||||
|
投稿日時: 2007-07-05 08:38
れいさん、アドバイスありがとうございます。 「GrowAndShrink」を早速調べてみました。とても勉強になりました。 アドバイスどおりに作ろうと思います。 ありがとうございました。 | ||||||||
|
投稿日時: 2007-07-05 09:12
早速このようにして実行してみたのですが、 カレンダーの右と下の部分に1ミリ程度のグレーの部分が出来てしまいます。 何か設定がおかしいのでしょうか・・・。 fCalendar = New frmCalendar fCalendar.AutoSize = True fCalendar.AutoSizeMode =Windows.Forms.AutoSizeMode.GrowAndShrink fCalendar.Location = New System.Drawing.Point(Me.Location.X, Me.Location.Y) fCalendar.Show() あと、このタイミングで相談してしまうのですが fCalendar.Location = New System.Drawing.Point(Me.Location.X, Me.Location.Y) で、ユーザコントロールの下にカレンダーを出そうとしているのですが、 希望通りの場所に出てくれません。 ベストはユーザコントロール内のMaskedTextBoxの下にくっつけるように出したいのですが、MaskedTextBoxのLocationで指定すると、デスクトップの左上に出てしまいます。 これはMaskedTextBoxのLocationで取得している数値が、ユーザコントロールのデザインのフォームにあたるところの一番上にあるからだと推測しているのですが・・・。 そこで、ユーザコントロールのLocationを指定したのですが、そうするとユーザコントロールを覆い隠す形で、(カレンダーの真ん中あたりの後ろにユーザコントロールがある状態です)表示されてしまいます。 何か良い方法がありましたらご教授お願い致します。 | ||||||||
|
投稿日時: 2007-07-05 10:04
もうひとつ質問になってしまうのですが、しかもオブジェクト指向の基本的なお話になってしまうのですが、フォームにしたカレンダーから、ユーザコントロールのMaskedTextBoxのTextを変更するにはどうしたら良いのでしょうか・・・。
カレンダーの日付がクリックされた時に、MaskedTextBoxの値を変更したいのです。 最初このように書いていました。 ============================================================= Private ParentCtrl As New EdDate(ユーザコントロール) Private Sub MonthCalendar1_DateChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DateRangeEventArgs) Handles MonthCalendar1.DateChanged ParentCtrl.SValue = CLng(Format(MonthCalendar1.SelectionStart, "yyyyMMdd")) Me.Hide() End Sub ============================================================= ・・・当然値は変わってくれません。 そこで http://dobon.net/vb/dotnet/form/accessanotherformdata.html を参考にしました。 fCalendar.Show(Me)と、ユーザコントロールを渡して表示するようにしました。 「所有されているフォームの取得」 で書かれている[Me.Owner]をイミディエイトウインドウで見てみると、テスト用のフォームがOwnerになっています・・・。これだと、フォームに配置する際のユーザコントロールのNameが同じでないと指定できないし、複数配置できない事になってしまいます(泣) こうなってくると、やはり呼び出し元を「追って」イベントを発生させた方が良いのでしょうか・・・。 なんとか自分でも調べてみますが、前回の質問とあわせてこちらの情報も頂けるととても嬉しいです。 皆様何卒よろしくお願い致します。 [ メッセージ編集済み 編集者: reiko 編集日時 2007-07-05 10:06 ] | ||||||||
|
投稿日時: 2007-07-05 10:33
知らない間にいろいろと先を越されておりました。orz
昨日もあれからせっせと実装していたのですが...
最初に設定されたコントロールの位置がおかしいのではないでしょうか。あるいは Anchor プロパティ や Dock プロパティで端を揃えないとダメかもしれません。それでもダメなら Resize のタイミングで動的に配置するロジックを書かなければならないかもしれません。
ユーザーコントロール側に MaskedTextBox の Text プロパティを公開したプロパティ メンバを実装するだけで良いと思います。MaskedTextBox 自体は隠蔽化しておきましょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |