DOBON.NET DOBON.NETプログラミング掲示板過去ログ

年月日コントロールについて

環境/言語:[Windwos7 C#2010Express]
分類:[.NET]

お世話になります。

「Vicual C# 実践講座 絶対現場主義」丸岡孝司氏著の
WindowsアプリケーションのP.305の年月日コントロールを
試しているのですが(下記コード)

public ExTextBox()
{
InitializeComponent();
}

で、InitializeComponentは現在のコンテキスト内に存在しません。
となり、コメントアウトしてテキストボックスをテストしても
例)日付2ケタ入力しても西暦表示にかわりません。


コントロールの作成は下記URLを参考にしました。

http://kbdpage.blog82.fc2.com/blog-entry-122.html

ご指導をお願いいたします。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Project3
{
public class ExTextBox:TextBox

{
private System.ComponentModel.Container components = null;

private DateTime m_DateValue = DateTime.Now;

private bool m_isValid = false;

[Category("表示")]
[Description("日付型の値です")]
public DateTime DateValue
{
get { return m_DateValue; }
set { m_DateValue = value; }
}
[Category("表示")]
[Description("正しい日付が入力されているかの判定結果です")]
public bool IsValid
{
get { return m_isValid; }
}
public ExTextBox()
{
InitializeComponent();
}

protected override void WndProc(ref System.Windows.Forms.Message m)
{
const int WM_CHAR = 0x0102;
const int WM_PASTE = 0x0302;
const int BKSP = 0x8;
switch (m.Msg)
{
case WM_CHAR:
if (m.WParam.ToInt32() == BKSP) break;
if ((char)m.WParam.ToInt32() > '9' ||
(char)m.WParam.ToInt32() < '0')
{
return;
}
break;
case WM_PASTE:
string strPaste = Clipboard.GetDataObject().GetData(System.Windows.Forms.DataFormats.Text).ToString();
if (strPaste != null)
{
this.SelectedText = string.Empty;

for (int i = 0; i < strPaste.Length; i++)
{
if (strPaste[i] <= '9' &&
strPaste[i] >= '0')
{
this.SelectedText += strPaste[i];
}
}
return;
}
break;
}

base.WndProc(ref m);
}
private void ExDateTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
if (this.Text.Length == 0)
{
this.m_isValid = true;
return;
}
if (this.Text.Length > 8)
{
this.m_isValid = false;
return;
}
if (this.Text.Length <= 2)
{
try
{
this.m_DateValue = new DateTime(DateTime.Now.Year, DateTime.Now.Month, int.Parse(this.Text));
this.Text = this.m_DateValue.ToString("yyyyMMdd");
this.m_isValid = true;
}
catch
{
this.m_isValid = false;
}
}
else if (this.Text.Length == 3)
{
try
{
this.m_DateValue = new DateTime(DateTime.Now.Year,
int.Parse(this.Text.Substring(0, 1)),
int.Parse(this.Text.Substring(1, 2)));
this.Text = this.m_DateValue.ToString("yyyyMMdd");
this.m_isValid = true;
}
catch
{
this.m_isValid = false;
}
}

else if (this.Text.Length == 4)
{
try
{
this.m_DateValue = new DateTime(DateTime.Now.Year,
int.Parse(this.Text.Substring(0, 2)),
int.Parse(this.Text.Substring(2, 2)));
this.Text = this.m_DateValue.ToString("yyyyMMdd");
this.m_isValid = true;
}
catch
{
this.m_isValid = false;
}
}
else if (this.Text.Length == 5)
{
try
{
this.m_DateValue = new DateTime(2000 + int.Parse(this.Text.Substring(0, 1)),
int.Parse(this.Text.Substring(1, 2)),
int.Parse(this.Text.Substring(3, 2)));
this.Text = this.m_DateValue.ToString("yyyyMMdd");
this.m_isValid = true;
}
catch
{
this.m_isValid = false;
}
}
else if (this.Text.Length == 6)
{
try
{
this.m_DateValue = new DateTime(
2000 + int.Parse(this.Text.Substring(0, 2)),
int.Parse(this.Text.Substring(2, 2)),
int.Parse(this.Text.Substring(4, 2)));
this.m_isValid = true;

}
catch
{
this.m_isValid = false;
}
}
else if (this.Text.Length == 7)
{
try
{
this.m_DateValue = new DateTime(
2000 + int.Parse(this.Text.Substring(0, 3)),
int.Parse(this.Text.Substring(3, 2)),
int.Parse(this.Text.Substring(5, 2)));
this.Text = this.m_DateValue.ToString("yyyyMMdd");
this.m_isValid = true;
}
catch
{
this.m_isValid = false;
}
}
else
{
try
{
this.m_DateValue = new DateTime(
int.Parse(this.Text.Substring(0, 4)),
int.Parse(this.Text.Substring(4, 2)),
int.Parse(this.Text.Substring(6, 2)));
this.Text = this.m_DateValue.ToString("yyyyMMdd");
this.m_isValid = true;
}
catch
{
this.m_isValid = false;
}
}
}

}
}
■No29173に返信(sueくんさんの記事)
> 「Vicual C# 実践講座 絶対現場主義」丸岡孝司氏著の
> WindowsアプリケーションのP.305の年月日コントロールを
> 試しているのですが(下記コード)
(略)
> で、InitializeComponentは現在のコンテキスト内に存在しません。
> となり、コメントアウトしてテキストボックスをテストしても
> 例)日付2ケタ入力しても西暦表示にかわりません。
(略)
> コントロールの作成は下記URLを参考にしました。

なぜ、複数の情報源(サイト、書籍)を組み合わせるようなことをしているのでしょうか?
コード片を見る限り、書籍はそのページのように継承して作ることを前提としていないように思われますけれど、どうなんでしょうか?

書籍を元に作るなら書籍の作り方通りに一度やってみて、必要なエッセンスを引き出せるようにしてください。

> private void ExDateTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)

とりあえず、このメソッドは使われていない、m_DateValue を適切に設定したところで表示(Text プロパティ)に影響しないので、思うように動かないのは仕方ないことだと思います。
適当にやるのではなく、コードの意味を理解するようにしましょう。

Azuleanさん

ご指導ありがとうございます。

private void ExDateTextBox_Validatingを
private void ExTextBox_Validatingに直してみましたが、
変化がありませんでした。

ご指摘の作成の仕方についてですが、最初は、書籍どおりに作成しましたが
動きがなく、コントロールのつくりかたに問題があるのではないかと思い
今回の作成方法になりました。

誠に初心者の質問で申し訳ございません。
よろしくお願いいたします。

■No29175に返信(Azuleanさんの記事)
> ■No29173に返信(sueくんさんの記事)
>>「Vicual C# 実践講座 絶対現場主義」丸岡孝司氏著の
>>WindowsアプリケーションのP.305の年月日コントロールを
>>試しているのですが(下記コード)
> (略)
>>で、InitializeComponentは現在のコンテキスト内に存在しません。
>>となり、コメントアウトしてテキストボックスをテストしても
>>例)日付2ケタ入力しても西暦表示にかわりません。
> (略)
>>コントロールの作成は下記URLを参考にしました。
>
> なぜ、複数の情報源(サイト、書籍)を組み合わせるようなことをしているのでしょうか?
> コード片を見る限り、書籍はそのページのように継承して作ることを前提としていないように思われますけれど、どうなんでしょうか?
>
> 書籍を元に作るなら書籍の作り方通りに一度やってみて、必要なエッセンスを引き出せるようにしてください。
>
>> private void ExDateTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
>
> とりあえず、このメソッドは使われていない、m_DateValue を適切に設定したところで表示(Text プロパティ)に影響しないので、思うように動かないのは仕方ないことだと思います。
> 適当にやるのではなく、コードの意味を理解するようにしましょう。
Azuleanさん

お世話になります。
基礎から再度勉強しなおして、チャレンジしてみます。
ありがとうございました。


■No29175に返信(Azuleanさんの記事)
> ■No29173に返信(sueくんさんの記事)
>>「Vicual C# 実践講座 絶対現場主義」丸岡孝司氏著の
>>WindowsアプリケーションのP.305の年月日コントロールを
>>試しているのですが(下記コード)
> (略)
>>で、InitializeComponentは現在のコンテキスト内に存在しません。
>>となり、コメントアウトしてテキストボックスをテストしても
>>例)日付2ケタ入力しても西暦表示にかわりません。
> (略)
>>コントロールの作成は下記URLを参考にしました。
>
> なぜ、複数の情報源(サイト、書籍)を組み合わせるようなことをしているのでしょうか?
> コード片を見る限り、書籍はそのページのように継承して作ることを前提としていないように思われますけれど、どうなんでしょうか?
>
> 書籍を元に作るなら書籍の作り方通りに一度やってみて、必要なエッセンスを引き出せるようにしてください。
>
>> private void ExDateTextBox_Validating(object sender, System.ComponentModel.CancelEventArgs e)
>
> とりあえず、このメソッドは使われていない、m_DateValue を適切に設定したところで表示(Text プロパティ)に影響しないので、思うように動かないのは仕方ないことだと思います。
> 適当にやるのではなく、コードの意味を理解するようにしましょう。
解決済み!
■No29181に返信(sueくんさんの記事)
> private void ExDateTextBox_Validatingを
> private void ExTextBox_Validatingに直してみましたが、
> 変化がありませんでした。

なぜその修正をしたのですか?
理由を推測で結構ですので、書いてみてください。

> ご指摘の作成の仕方についてですが、最初は、書籍どおりに作成しましたが
> 動きがなく、コントロールのつくりかたに問題があるのではないかと思い
> 今回の作成方法になりました。

きちんと全部読んで手順通りに実施したのですか?部分的に持ってきたり、違う章・節のものを無理矢理組み合わせたりしていませんか?

たぶん、コードだけ書いて、ユーザーコントロールを作るとか、テキストボックスを置くとか、イベントを割り付けると言った所作をすっ飛ばしたのでは?


あと、解決していないのであれば、解決済みにしないでください。

DOBON.NET | プログラミング道 | プログラミング掲示板