2014年09月03日
[C#]日付チェック(スラッシュありなし両方対応)
///<summary>
///日付の入力チェック
///</summary>
///<param name="sDate">チェックする文字列</param>
///<param name="dt">ref DateTime型変数</param>
///<returns>日付として正当な値の場合true、不正のときfalse</returns>
private bool DateCheck(string sDate, ref DateTime dt)
{
//日付にスラッシュが含まれる場合(2014/09/03 や 2014/9/3)
if (sDate.Contains("/") == true)
{
return DateTime.TryParse(sDate, out dt);
}
//日付にスラッシュが含まれない場合(20140903=OK、201493=NG)
return DateTime.TryParseExact(sDate, "yyyyMMdd", null, DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite, out dt);
}
///日付の入力チェック
///</summary>
///<param name="sDate">チェックする文字列</param>
///<param name="dt">ref DateTime型変数</param>
///<returns>日付として正当な値の場合true、不正のときfalse</returns>
private bool DateCheck(string sDate, ref DateTime dt)
{
//日付にスラッシュが含まれる場合(2014/09/03 や 2014/9/3)
if (sDate.Contains("/") == true)
{
return DateTime.TryParse(sDate, out dt);
}
//日付にスラッシュが含まれない場合(20140903=OK、201493=NG)
return DateTime.TryParseExact(sDate, "yyyyMMdd", null, DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite, out dt);
}
2014年07月07日
[C#]8桁の数字(文字列)をDateTime型に変換
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1088691645
using System.Globalization;
DateTime dt;
string sDate = "20120607";
if (!DateTime.TryParseExact(sDate, "yyyyMMdd", null, DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite, out dt))
{
dt = DateTime.Now;
}
変換が成功していれば dt に変換後の値が入っている
失敗しているとdt にはDateTime.MinValue が入っているので、ここでは、DateTime.Nowを入れなおしている.
using System.Globalization;
DateTime dt;
string sDate = "20120607";
if (!DateTime.TryParseExact(sDate, "yyyyMMdd", null, DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite, out dt))
{
dt = DateTime.Now;
}
変換が成功していれば dt に変換後の値が入っている
失敗しているとdt にはDateTime.MinValue が入っているので、ここでは、DateTime.Nowを入れなおしている.
2014年07月04日
フォーム上のテキストボックスコントロールを取得して入力チェック
foreach (var c in this.Controls.OfType())
{
//ex
if (c.Text == string.Empty)
{
MessageBox.Show("空です");
c.Focus();
return;
}
if (File.Exists(c.Text) == false)
{
MessageBox.Show("変です");
c.Focus();
c.SelectAll();
return;
}
}
foreach (var c in this.Controls.OfType())
ここの部分が
foreach (Control c in this.Controls)
だと、
c.SelectAll();
ができない。(cがControl型。SelectAllはTextBoxのメソッド。)
C# window form
{
//ex
if (c.Text == string.Empty)
{
MessageBox.Show("空です");
c.Focus();
return;
}
if (File.Exists(c.Text) == false)
{
MessageBox.Show("変です");
c.Focus();
c.SelectAll();
return;
}
}
foreach (var c in this.Controls.OfType
ここの部分が
foreach (Control c in this.Controls)
だと、
c.SelectAll();
ができない。(cがControl型。SelectAllはTextBoxのメソッド。)
C# window form
2011年01月24日
2010年03月15日
【C#】decimal サフィックスのm
プログラムの中に何かの計算式があって、
Convert.ToInt32(fun / 6m * 10m);
と書いてあり(funはint型)、
6m、10m の m って何?
ってなりました。
どうもdecimal型で計算してるぽいなぁと思って調べました。
マイクロソフトリファレンスより
http://msdn.microsoft.com/ja-jp/library/364x0z75.aspx
decimal キーワードは、128 ビットのデータ型を示します。
decimal 型は、浮動小数点型よりも有効桁数が多く、範囲が狭いので、財務や金融の計算に適しています。
範囲
±1.0 × 10−28 to ±7.9 × 1028
実数値リテラルを decimal として扱うには、サフィックス m または M を使用します。
decimal myMoney = 300.5m;
サフィックス m がない場合は double として扱われ、コンパイラ エラーになります。
整数型は、暗黙的に decimal に変換され、結果は decimal になります。
したがって、サフィックスなしで整数リテラルを使用して 10 進変数を初期化できます。
decimal myMoney = 300;
decimal 型と数値の整数型を同じ式に混在させることもできます。
同じ式に decimal と int が混在している例を示します。結果は decimal 型になります。
decimal d = 9.1m;
int y = 3;
d + y はdecimal型の12.1
てことは、さっきの計算式はint型とサフィックスをくっつけたdecimal型の値を計算して、
結果をdecimalで求めてるって事(・・・であってんのかな(汗)
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

Convert.ToInt32(fun / 6m * 10m);
と書いてあり(funはint型)、
6m、10m の m って何?
ってなりました。
どうもdecimal型で計算してるぽいなぁと思って調べました。
マイクロソフトリファレンスより
http://msdn.microsoft.com/ja-jp/library/364x0z75.aspx
decimal キーワードは、128 ビットのデータ型を示します。
decimal 型は、浮動小数点型よりも有効桁数が多く、範囲が狭いので、財務や金融の計算に適しています。
範囲
±1.0 × 10−28 to ±7.9 × 1028
実数値リテラルを decimal として扱うには、サフィックス m または M を使用します。
decimal myMoney = 300.5m;
サフィックス m がない場合は double として扱われ、コンパイラ エラーになります。
整数型は、暗黙的に decimal に変換され、結果は decimal になります。
したがって、サフィックスなしで整数リテラルを使用して 10 進変数を初期化できます。
decimal myMoney = 300;
decimal 型と数値の整数型を同じ式に混在させることもできます。
同じ式に decimal と int が混在している例を示します。結果は decimal 型になります。
decimal d = 9.1m;
int y = 3;
d + y はdecimal型の12.1
てことは、さっきの計算式はint型とサフィックスをくっつけたdecimal型の値を計算して、
結果をdecimalで求めてるって事(・・・であってんのかな(汗)
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

2009年12月03日
【C#】ドロップダウンリストにListItemをAddする
2つの(複数の)ドロップダウンリストに同じListItemをAddしたとする。
こんな感じ。
ListItem li = new ListItem();
li.Text = ""; li.Value = "-1";
ListItem li2 = new ListItem();
li2.Text = "あ"; li2.Value = "100"
dropdownlist1.Items.Add(li);
dropdownlist1.Items.Add(li2);
dropdownlist2.Items.Add(li)
dropdownlist2.Items.Add(li2);
こうすると2つのドロップダウンリストが同じオブジェクトのListItemを見ている(参照している)ことになる。
そこで、dropdownlist1の方【だけ】SelectedIndexを変えようとする。
dropdownlist1.SelectedIndex = 1;
SelectedIndexを指定すると、ListItemのSelectedプロパティがtrueに変わるのだけれども
(この場合、liのSelectedプロパティがtrueになる。)
Selectedプロパティを変えたそのListItemはdropdownlist2でも参照しているので、
結果、dropdownlist2のSelectedIndexも変わってしまう。
2つのドロップダウンリストはいつも同じ選択値・・・
これが原因のバグに出会ったことがあるけど、気持ち的にはわかる。
ListItemを値型のつもりでコーディングしたのでしょう。
本来なら、
dropdownlist1.Items.Insert(0, new ListItem("", "-1"));
dropdownlist2.Items.Insert(0, new ListItem("", "-1"));
のようにそれぞれにListItemをnewしないといけない。
けっこうコロっと忘れてしまうのよね・・・(汗
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ
こんな感じ。
ListItem li = new ListItem();
li.Text = ""; li.Value = "-1";
ListItem li2 = new ListItem();
li2.Text = "あ"; li2.Value = "100"
dropdownlist1.Items.Add(li);
dropdownlist1.Items.Add(li2);
dropdownlist2.Items.Add(li)
dropdownlist2.Items.Add(li2);
こうすると2つのドロップダウンリストが同じオブジェクトのListItemを見ている(参照している)ことになる。
そこで、dropdownlist1の方【だけ】SelectedIndexを変えようとする。
dropdownlist1.SelectedIndex = 1;
SelectedIndexを指定すると、ListItemのSelectedプロパティがtrueに変わるのだけれども
(この場合、liのSelectedプロパティがtrueになる。)
Selectedプロパティを変えたそのListItemはdropdownlist2でも参照しているので、
結果、dropdownlist2のSelectedIndexも変わってしまう。
2つのドロップダウンリストはいつも同じ選択値・・・
これが原因のバグに出会ったことがあるけど、気持ち的にはわかる。
ListItemを値型のつもりでコーディングしたのでしょう。
本来なら、
dropdownlist1.Items.Insert(0, new ListItem("", "-1"));
dropdownlist2.Items.Insert(0, new ListItem("", "-1"));
のようにそれぞれにListItemをnewしないといけない。
けっこうコロっと忘れてしまうのよね・・・(汗
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

2009年11月21日
【C#】DataTableをソートしたい
DataTableをソートするには
昔メモっていたものをそのまま転記すると、
DataViewを利用します。
DataTable dtA:元のデータ
DataTable dtB:並べ替えたデータ
dtB = dtA.Clone();
DataView dv = new DataView(dtA);
dv.sort = "列名1,列名2";
foreach(DataRowView drv in dv)
{
dt2.ImportRow(drv.Row);
}
今回調べてわかったこと
コントロールや BindingSource の DataSource に DataTable を設定した場合、
実際にはその DataTable の DefaultView で返される DataView がデータソースとして使用される。
http://ap.atmarkit.co.jp/bbs/core/fdotnet/15945
http://dotnetfan.org/forums/permalink/89/89/ShowThread.aspx
DataTable からDataViewを生成する方法
http://www.yel.m-net.ne.jp/~oss/Tips/ADO/Tips_02001.htm
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ
昔メモっていたものをそのまま転記すると、
DataViewを利用します。
DataTable dtA:元のデータ
DataTable dtB:並べ替えたデータ
dtB = dtA.Clone();
DataView dv = new DataView(dtA);
dv.sort = "列名1,列名2";
foreach(DataRowView drv in dv)
{
dt2.ImportRow(drv.Row);
}
今回調べてわかったこと
コントロールや BindingSource の DataSource に DataTable を設定した場合、
実際にはその DataTable の DefaultView で返される DataView がデータソースとして使用される。
http://ap.atmarkit.co.jp/bbs/core/fdotnet/15945
http://dotnetfan.org/forums/permalink/89/89/ShowThread.aspx
DataTable からDataViewを生成する方法
http://www.yel.m-net.ne.jp/~oss/Tips/ADO/Tips_02001.htm
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

2009年11月12日
【C#】string [] 配列
最終的な要素数が不確定なstring[]配列を戻り値として返すメソッドを作ることになって、へなちょこなわたくしはArrayListクラスと配列を混同し、
「とりあえずstring[]配列を初期化して、必要な数だけループして値を配列に入れていけばいいじゃん」
と思ったら、要素数を指定しないといけないことを思い出す(アホ)
【イメージ(間違っている!)】
string[] array = new string[]{}; ←これで要素数が0の配列になっちゃってる
for(int i = 0; i < Cnt; i++)
{
array[i] = "値";
}
正しくはArrayListクラスを利用し、
ArrayList arrList = new ArrayList();
for(int i = 0; i < Cnt; i++)
{
arrList.Add("値");
}
で、可変のリストを作って、
(string[])arrList.ToArray(typeof(string));
で、配列に変換したものを戻り値にする。
結果的に要素数が可変の配列が取得できると。。。
@IT .NET TIPS
C#で配列を宣言するには?
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ
「とりあえずstring[]配列を初期化して、必要な数だけループして値を配列に入れていけばいいじゃん」
と思ったら、要素数を指定しないといけないことを思い出す(アホ)
【イメージ(間違っている!)】
string[] array = new string[]{}; ←これで要素数が0の配列になっちゃってる
for(int i = 0; i < Cnt; i++)
{
array[i] = "値";
}
正しくはArrayListクラスを利用し、
ArrayList arrList = new ArrayList();
for(int i = 0; i < Cnt; i++)
{
arrList.Add("値");
}
で、可変のリストを作って、
(string[])arrList.ToArray(typeof(string));
で、配列に変換したものを戻り値にする。
結果的に要素数が可変の配列が取得できると。。。
@IT .NET TIPS
C#で配列を宣言するには?
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

2009年11月06日
【C#】プロパティの自動実装
プロパティを実装するのによく書き方を忘れるので、メモっておこうとしたが、
VS2005とVS2008では自動で実装が出来るということを今頃知り、感動中。。
private string MyValue;
public string MyPropaty
{
get{return MyValue;}
set{MyValue = value;}
}
これ、今まで手書きしてた(VS2003)
VS2005では(わたくしは使ったことないけど)
「prop」と入力して、Tabキーを2回押すと、
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
と自動で実装してくれ、
VS2008でも「prop」と入力して、Tabキーを2回押すと、
public int MyProperty { get; set; }
と自動実装されます。
VS2008の場合、
フィールド変数を省略して記述が出来る。(コード上の記述が省略されているだけで、コンパイル時に内部でフィールド変数が追加されている)。
自動実装するプロパティでは、getアクセサ(getter)とsetアクセサ(setter)の両方が追加されるが、この片方を消すようなことはできない。
そうです。
参考
@IT .NET TIPS
手軽にプロパティを実装するには?[C#、VS 2008、3.5]
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ
VS2005とVS2008では自動で実装が出来るということを今頃知り、感動中。。
private string MyValue;
public string MyPropaty
{
get{return MyValue;}
set{MyValue = value;}
}
これ、今まで手書きしてた(VS2003)

VS2005では(わたくしは使ったことないけど)
「prop」と入力して、Tabキーを2回押すと、
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
と自動で実装してくれ、
VS2008でも「prop」と入力して、Tabキーを2回押すと、
public int MyProperty { get; set; }
と自動実装されます。
VS2008の場合、
フィールド変数を省略して記述が出来る。(コード上の記述が省略されているだけで、コンパイル時に内部でフィールド変数が追加されている)。
自動実装するプロパティでは、getアクセサ(getter)とsetアクセサ(setter)の両方が追加されるが、この片方を消すようなことはできない。
そうです。
参考
@IT .NET TIPS
手軽にプロパティを実装するには?[C#、VS 2008、3.5]
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

2009年11月01日
【C#】DataTable Selectメソッド
メモ。
DataTable Selectメソッド
(一番よく使うのはパラメータが1つのもの)
DataRow[] Select ( string filterExpression )
パラメータ:filterExpression
行にフィルタをかけるために使用する基準。
戻り値:DataRow オブジェクトの配列。
フィルタ基準と一致するすべての DataRow オブジェクトを主キーの順に (主キーがない場合は追加された順に) 配列として取得。
例えばDataTable dtにDBから取得したテーブルのデータが入っているとしたら、
DataRow[] SelectedRow = dt.Select("列名1<= 100 AND 列名2=0");
SQLのwhere句を同じように書くと、その条件にあったDataRowが取得できる。
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

DataTable Selectメソッド
(一番よく使うのはパラメータが1つのもの)
DataRow[] Select ( string filterExpression )
パラメータ:filterExpression
行にフィルタをかけるために使用する基準。
戻り値:DataRow オブジェクトの配列。
フィルタ基準と一致するすべての DataRow オブジェクトを主キーの順に (主キーがない場合は追加された順に) 配列として取得。
例えばDataTable dtにDBから取得したテーブルのデータが入っているとしたら、
DataRow[] SelectedRow = dt.Select("列名1<= 100 AND 列名2=0");
SQLのwhere句を同じように書くと、その条件にあったDataRowが取得できる。
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

2009年10月30日
【C#】DataTable Computeメソッド
DataTable Computeメソッド
DataTableの特定列の MAX,MIN,SUM,AVE等の集約計算を行う時に使用。
戻り値がObject型なので注意。
Compute(expression, filter)
パラメータ1 expression
型 : System.String
計算する式。
パラメータ2 filter
型 : System.String
式で評価される行を制限するフィルタ。
例えばDataTable dtにDBから取得したテーブルのデータが入っているとしたら、
フィルターを指定しないときはnull
object obj = dt.Compute("Sum(列名)",null);
フィルターを指定するとき
object obj = dt.Compute("Sum(列名)","列名1=○○");
DataTableに行(ROW)がないときの戻り値はnull。
基本的には、データベースから取得したデータが入っているDataTableを
さらにプログラム側でSUMしたり加工するなら、
データベースからデータを取得する時点で集計をかけたデータを取得
してくればいいと思っているが、
仕様変更による修正をしていた際に、複雑怪奇なSQLがガチガチに組んであり、
SQLを修正できなかったことがあり、そのときにこのメソッドが役立った。
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ
DataTableの特定列の MAX,MIN,SUM,AVE等の集約計算を行う時に使用。
戻り値がObject型なので注意。
Compute(expression, filter)
パラメータ1 expression
型 : System.String
計算する式。
パラメータ2 filter
型 : System.String
式で評価される行を制限するフィルタ。
例えばDataTable dtにDBから取得したテーブルのデータが入っているとしたら、
フィルターを指定しないときはnull
object obj = dt.Compute("Sum(列名)",null);
フィルターを指定するとき
object obj = dt.Compute("Sum(列名)","列名1=○○");
DataTableに行(ROW)がないときの戻り値はnull。
基本的には、データベースから取得したデータが入っているDataTableを
さらにプログラム側でSUMしたり加工するなら、
データベースからデータを取得する時点で集計をかけたデータを取得
してくればいいと思っているが、
仕様変更による修正をしていた際に、複雑怪奇なSQLがガチガチに組んであり、
SQLを修正できなかったことがあり、そのときにこのメソッドが役立った。
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

2009年10月12日
【C#】数字が入力されているかチェック
try
{
int.Parse(txtbox.Text);
}
catch(FormatException)
{
MessageBox.Show("数字のみ入力してください。");
}
・・・入力チェックに例外処理使ってよいのでしょうか?
個人的には嫌いです。楽なんですけど。
これ、Int32の数値範囲を超えるとバグりますね。
じゃあ、Doubleにすればよいのかというとそうじゃなくて・・・
で、数字かどうかのチェックはどうすればよいかと。
Char.IsDigit メソッド
Char.IsNumber メソッド
も使えそうでしたが、これ、全角の数字なんかもOKらしい。
今回は、半角数字だけを入力可にしたいので、正規表現を使って、
if(System.Text.RegularExpressions.Regex.IsMatch(textbox.Text,"^[0-9]+$") == false)
{
MessageBox.Show("数字じゃない文字が入ってる!");
}
ってしてみた。
でこの正規表現、よく使う割りに全く覚えられないのです
毎回調べます。
0-9 のみの文字列 "^[0-9]+$"
a-z のみの文字列 "^[a-z]+$"
"[0-9]+"は数字が含まれていればなんでもOK
いつもお世話になっております。

この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ
{
int.Parse(txtbox.Text);
}
catch(FormatException)
{
MessageBox.Show("数字のみ入力してください。");
}
・・・入力チェックに例外処理使ってよいのでしょうか?
個人的には嫌いです。楽なんですけど。
これ、Int32の数値範囲を超えるとバグりますね。
じゃあ、Doubleにすればよいのかというとそうじゃなくて・・・
で、数字かどうかのチェックはどうすればよいかと。
Char.IsDigit メソッド
Char.IsNumber メソッド
も使えそうでしたが、これ、全角の数字なんかもOKらしい。
今回は、半角数字だけを入力可にしたいので、正規表現を使って、
if(System.Text.RegularExpressions.Regex.IsMatch(textbox.Text,"^[0-9]+$") == false)
{
MessageBox.Show("数字じゃない文字が入ってる!");
}
ってしてみた。
でこの正規表現、よく使う割りに全く覚えられないのです

毎回調べます。
0-9 のみの文字列 "^[0-9]+$"
a-z のみの文字列 "^[a-z]+$"
"[0-9]+"は数字が含まれていればなんでもOK
いつもお世話になっております。

この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
人気ブログランキングへ

2009年09月17日
【C#】short型 + short型 = int型
異なる型どうしを演算しようとすると、結果はサイズが大きいほうの型で
返ってくるのが一般的だというのは感覚的にわかっているのですが。。。
double型 + int型 = double型 みたいな。
で、short+shortの結果をshort型に入れようとすると、エラーになってびっくりした。
short x = 5;
short y = 12;
//ビルドエラー:型 'int' を型 'short' に暗黙的に変換できません
short z = x + y;
//キャストすればOK
short z = (short)(x + y);
調べると「代入演算子の右側にある算術式が既定で int に評価される」とヘルプに載ってた。
sbyte+sbyteも同様にintで返ってくるみたい。
こういう決まりを単項数値昇格とか二項数値昇格っていうらしい。
参考↓
int (符号付き 32 ビット整数:-2,147,483,648 ~ 2,147,483,647)
short(符号付き 16 ビット整数:-32,768 ~ 32,767)
sbyte(符号付き 8 ビット整数:-128 ~ 127)
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
返ってくるのが一般的だというのは感覚的にわかっているのですが。。。
double型 + int型 = double型 みたいな。
で、short+shortの結果をshort型に入れようとすると、エラーになってびっくりした。
short x = 5;
short y = 12;
//ビルドエラー:型 'int' を型 'short' に暗黙的に変換できません
short z = x + y;
//キャストすればOK
short z = (short)(x + y);
調べると「代入演算子の右側にある算術式が既定で int に評価される」とヘルプに載ってた。
sbyte+sbyteも同様にintで返ってくるみたい。
こういう決まりを単項数値昇格とか二項数値昇格っていうらしい。
参考↓
int (符号付き 32 ビット整数:-2,147,483,648 ~ 2,147,483,647)
short(符号付き 16 ビット整数:-32,768 ~ 32,767)
sbyte(符号付き 8 ビット整数:-128 ~ 127)
この記事がお役に立ったようでしたらぜひクリックお願いしますm(_ _)m
