- PR -

数値型をソースとするTextBoxに一旦入れた後空白にしたい

投稿者投稿内容
island_town
ベテラン
会議室デビュー日: 2007/05/08
投稿数: 77
投稿日時: 2008-01-09 14:03
Visual Studio 2008にして解決するのであれば
どなたか教えてください。
island_town
ベテラン
会議室デビュー日: 2007/05/08
投稿数: 77
投稿日時: 2008-01-09 21:11
ValidateChildren()の前にTextBoxが空白かチェックして
空白だったらTextBoxに0を入れてprivate変数のフラグを立て
ValidateChidren()とEndEdit()した後
private変数のフラグが立っていたら
bindingSourceをDBNull.Valueにして
TextBoxを空白に戻すという方法を思いつきました。

うまく行くかもしれません。
明日やってみます。

[ メッセージ編集済み 編集者: island_town 編集日時 2008-01-09 21:12 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-01-10 07:02
ValidateChildren は、内包するコントロールの Validating イベントを呼び出し、一つでも FALSE だったら FALSE を返します。
であるなら、すべての Validating イベントにブレーク ポイントを設定して、なにが FALSE になっているのか確認してみては?
island_town
ベテラン
会議室デビュー日: 2007/05/08
投稿数: 77
投稿日時: 2008-01-10 09:30
Jittaさん、ValidateChildren()はコードに書いたことの他に
編集したフィールドの型チェックも行っているみたいで
そこでエラーになるみたいなのです。
island_town
ベテラン
会議室デビュー日: 2007/05/08
投稿数: 77
投稿日時: 2008-01-10 09:33
うまく行きました。コードを載せます。

コード:

public partial class Form1 : Form
{
private bool NumNullFlg = false;
private bool AgeNullFlg = false;

public Form1()
{
InitializeComponent();
}

private void table1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.BeforeSave();
if (this.ValidateChildren() == false)
{
MessageBox.Show("入力項目にエラーがあります");
return;
}
this.table1BindingSource.EndEdit();
this.SetNull();
this.table1TableAdapter.Update(this.customerDataSet.Table1);
MessageBox.Show("更新しました");
}

private void BeforeSave()
{
String Value;
Value = this.numTextBox.Text;
if (Value.Equals(""))
{
this.numTextBox.Text = "0";
this.NumNullFlg = true;
}
else
{
this.NumNullFlg = false;
}
Value = this.ageTextBox.Text;
if (Value.Equals(""))
{
this.ageTextBox.Text = "0";
this.AgeNullFlg = true;
}
else
{
this.AgeNullFlg = false;
}
}

private void SetNull()
{
if (this.NumNullFlg)
{
((DataRowView)this.table1BindingSource.Current)["Num"] = DBNull.Value;
this.NumNullFlg = false;
}
if (this.AgeNullFlg)
{
((DataRowView)this.table1BindingSource.Current)["Age"] = DBNull.Value;
this.AgeNullFlg = false;
}
}

private void Form1_Load(object sender, EventArgs e)
{
this.table1TableAdapter.Fill(this.customerDataSet.Table1);
}

private void ageTextBox_Validating(object sender, CancelEventArgs e)
{
String Value = ((TextBox)sender).Text;
if (Value.Equals(""))
{
this.errorProvider1.SetError(this.ageTextBox, "");
return;
}
int Val;
try
{
Val = Int32.Parse(Value);
if (Val > 100)
{
this.errorProvider1.SetError(this.ageTextBox,"数値が範囲外です");
e.Cancel = true;
}
else
{
this.errorProvider1.SetError(this.ageTextBox, "");
}
}
catch (Exception)
{
this.errorProvider1.SetError(this.ageTextBox, "形式が不正です");
e.Cancel = true;
}
}

private void numTextBox_Validating(object sender, CancelEventArgs e)
{
String Value = ((TextBox)sender).Text;
if (Value.Equals(""))
{
this.errorProvider1.SetError(this.numTextBox, "");
return;
}
int Val;
try
{
Val = Int32.Parse(Value);
this.errorProvider1.SetError(this.numTextBox, "");
}
catch (Exception)
{
this.errorProvider1.SetError(this.numTextBox, "形式が不正です");
e.Cancel = true;
}
}
  }



なお数値型の型チェックのみのValidatingは
ErrorProviderを表示するために行っております。


[ メッセージ編集済み 編集者: island_town 編集日時 2008-01-10 11:17 ]
island_town
ベテラン
会議室デビュー日: 2007/05/08
投稿数: 77
投稿日時: 2008-01-10 11:03
抜けてました。
ValidateChildren()がfalseを返した時に
0に置き換えたTextBoxを空白に戻してから
return;する必要があります。

コード:

private void SetNullError()
{
if (this.NumNullFlg)
{
numTextBox.Text = "";
this.NumNullFlg = false;
}
if (this.AgeNullFlg)
{
this.ageTextBox.Text = "";
this.AgeNullFlg = false;
}
}



[ メッセージ編集済み 編集者: island_town 編集日時 2008-01-10 11:23 ]
island_town
ベテラン
会議室デビュー日: 2007/05/08
投稿数: 77
投稿日時: 2008-01-10 11:06
うわあっベテランさんになってしまったあ〜。
常連さんでいいのに〜
失礼しました。

[ メッセージ編集済み 編集者: island_town 編集日時 2008-01-10 11:06 ]
island_town
ベテラン
会議室デビュー日: 2007/05/08
投稿数: 77
投稿日時: 2008-01-10 13:07
TextBoxの(DataBindings)の(詳細)から
形式の種類-数字を選んで小数点以下の桁数を指定し
Null値に適当な文字を入れると
その文字がNullとして認識されるようです。
ただし空白は駄目なようです。

スキルアップ/キャリアアップ(JOB@IT)