プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

キャストについて【C#】

昨日は、キャストが思いつかず悔しい思いをしました。
忘れないように、コードを残します。

問題のキャスト処理を書く前に、条件分岐の処理も復習します。

ublic void kakunin_Click(C1.WPF.DataGrid.DataGridEventArgs e)
{
	this.IsRegistEnable = true; //登録ボタンにバインドさせている。
	bool isError = false;
	string name = e.Column.Name;

	DataRowView dv = (DataRowView)e.Row.DataItem;
	dv.Row.ClearErrors();
	e.Row.Errors.Clear();

	DataGridRowError  dgreroor = new DataGridRowError();

	//必須入力チェック
	//sentakuメソッドで、DataGridの項目の選択か必須かを判断している。
	if(!this.sentaku(name))
	{
		//DtoCheckメソッドにて、エラーの出ているメソッドを判別。
		isError = this.DtoCheck(e.Column,dv.Row)
		if(isError)
		{
			dgreroor.ColumnNames.Add(name);
			dgreroor.Message="必須入力エラー";
			e.Row.Errors.Add(dgreroor);
			dv.Row.SetColumnError(name,"[項目:"+ name + "]を入力してください");
		}
	}

	//switchで、入力した値が項目に合う値なのか(数字なのか、半角英数なのかなど)判別。
	switch(name)
	{
		case"aa":
		case"bb":
		if(!InputAuxiliaryUtil.IsNumeric(dv[name].Tostring()))
		{
			dgreroor.ColumnNames.Add(name);
			dgreroor.Message = "入力エラー"
			e.Row.Errors.Add(dgreroor);
			dgreroor.Row.SetColumnError(name,"数字を入力してください");
		
			isError = true;
		}
		break;

		case"cc":
		if(....)
		{
			//略...
		}
		break;

	}

	//エラーがあった場合、登録ボタンを使えないようにする。
	if(isError)
	{
		e.Cansel = true;
		this.IsRegistEnable = false;

	}

}

SetColumnErrorというのが、DataGridの問題セルに出現するエラーです。(見た目はフキダシみたいなものです)
InputAuxiliaryUtil.IsNumericというメソッドで、判定させます。

#region 文字チェック

public static bool IsNumeric(string value)
{
	if(null == value)
	{
		return true;
	}
	if(string.IsNullOrEmpty(value.Trim()))
	{
		return true;
	}
	if(!Regex.IsMach(value.Trim(),REGEX_Numeric))
	{
		return false;
	}

	return true;
}

#endregion


また、この文字チェック内で使われているREGEX_Numericは、辿っていくと正規表現にたどり着きます。

//こんなの
//これは例なので、正規表現は半角英数字の判別設定です。

private static string REGEX_Numeric = "^[-_/0-9a-zA-Z]+$";

DataGridは表示されるだけなので、入力文字についてはこのように自分で書いていかなければならないのです。

次はキャストです。

else if(e.Column.Name == "ff")
{
	dv[name] = dv[name].Tostring().PadLeft(2,'0')
}

これです。
間違って書いてコードは以下になります。

//このコードは間違っています。
else if(e.Column.Name == "ff")
{
	var i = (DataRowView)e.Row.DataItem;
	i.PadLeft(7,'0')

	string col = e.Column.Tostring();
	col.PadLeft(7,'0')
}

iやcolには値が入っていますが、オブジェクトを知りません。
ただ値を入れているという処理をしているだけなので、DataGridには何も変化がない、です。

値が入っているプロパティを見つけ、キャストして使用できるようにするまでが難しいな・・・。