2012/06/26

.NET チェックボックスを読み取り専用にする

フォームにチェックボックスを貼り付けて、読み取り専用にしようとして、プロパティでReadOnlyを探すも見つからず...
Enable を false にするのもなんだかな..ということで調べてみたら

AutoCheck を False

で解決。名前が分かりにくい..

2012/06/15

SQL文 COUNTの凡ミス...

SQLで特定のフィールドがNULLの行を数えようとしてCOUNTを使うときによくやってしまう凡ミス。

select COUNT(Field_Example) from TABLE_A where Field_Example is NULL

これだと0しかかえってこない。正しくは

select COUNT(Field_ID) from TABLE_A where Field_Example is NULL

(※ Field_ID の部分には主キーのフィールドをいれておけば大丈夫)

よくやってしまうミスなので注意しなければ。。。

2012/06/08

VB.NET コントロールなどの色をRGBで指定

コントロールの色などを指定するとき、たとえば以下のように設定できるが、

Object.Style.BackColor = Color.Gray

RGBで指定したいときに、以下のように指定することもできる

Object.Style.BackColor = Color.FromArgb(224, 224, 224)


VB.NET データグリッドビューの指定した位置に行を追加

データグリッドビューの指定した位置に行を追加したいときの処理。

DataGridView1.Rows.Add()

だと、データグリッドの末尾に行が追加されるが、

DataGridView1.Rows.Insert(iIndex)

で iIndex で指定した行の直前に行を挿入することができる。

2012/06/07

VB.NET データグリッドのコンボボックスにDBから選択した複数のデータを格納

データグリッドのセルをコンボボックスにして、そのコンボボックスに文字列だけではなく、複数の値を持たせたいときの処理

たとえば、TALBE_A に以下のようにデータが入っているとする。

TABLE_A: | Field_ID | Field_NAME | | 0001 | あああ | | 0002 | いいい | | 0003 | ううう | | 0004 | えええ | ...

このとき、TALBE_A からデータを取得してコンボボックスには以下のように「Field_NAME」の項目を表示させつつも、項目を選択時には「Field_ID」の値を取得するようにしたい。

コンボボックスのアイテム: | あああ | | いいい | | ううう | | えええ | ...

このとき、TABLE_A からSELECTしたデータを直接コンボボックスに渡して、かつ表示する値と、コンボボックス選択時に取得する値を以下のように設定することができる。

TABLE_A: Dim dt As DataTable 'データの取得 'SelectFromDB ...SQLを実行してDataTableを返す関数をどこかで定義 dt = SelectFromDB("select Field_ID, Field_NAME from TABLE_A order by Field_ID")  'ここでは、DataGridView1 の"ComboCell"という名前の列がコンボボックスになっている Dim comboCol As DataGridViewComboBoxColumn = Me.DataGridView1.Columns("ComboCell") 'データグリッドビューのコンボボックスにデータをバインド comboCol.DataSource = dt 'コンボボックスに表示されるのはTABLE_Aの「Field_NAME」のデータ comboCol.DisplayMember = "Field_NAME" 'コンボボックスの値として扱われるのは「Field_ID」のデータ comboCol.ValueMember = "Field_ID"

データを取得する際は、以下のようになる。

Dim dgvComboBox As DataGridViewComboBoxCell = _ DataGridView1.Rows(iRowNo).Cells("ComboCell") Dim iID As Integer = dgvComboBox.Value Dim strNAME As String = dgvComboBox.FormattedValue

valueとFormattedValueを利用する点に注意。

2012/06/05

エクセルで一行ごとに網掛けにする

エクセルで一行おきに網掛けにしたい場合の書式設定の仕方.


エクセル2003の場合:

①設定したい範囲を選択

②「書式」→「条件付き書式」を選択

③条件で「数式が」を選択

④数式として「=MOD(ROW(),2)=0」と入力

(※行番号を2で割った余りが0のとき,という条件→「偶数の場合」という条件を設定ことになる
奇数行にしたい場合は「=MOD(ROW(),2)=1」と入力すればよい)

⑤「書式」ボタンにて網掛けの設定をする




エクセル2010の場合:

①設定したい範囲を選択

②ホームタブの「条件付き書式」を選択→「新しいルール」を選択

③「ルールの種類を選択してください」の一覧から「数式を使用して,書式設定するセルを決定」を選択

④「次の数式を満たす場合に値を書式設定」の欄に 「=MOD(ROW(),2)=0」を入力

⑤「書式」ボタンにて網掛けの設定をする



以上の設定で選択範囲すべてに対して一度に網掛けの設定ができる.




2012/06/01

SQL 別のテーブルからフィールドの値をコピーしてUPDATEする

別のテーブルからフィールドの値をコピーしてそのテーブルのすべての行を一括でUPDATEしたいときのSQL文。

たとえば、以下のように TABLE_MEMBERDATA(なにかしらのメンバー表) と TABLE_PHONE_NUM (それぞれのメンバーの電話番号の表)にデータが格納されているとする。

TABLE_MEMBERDATA:
| ID | NAME | New_Field | | 001 | aaa | null | | 002 | bbb | null | | 003 | ccc | null | | 004 | ddd | null | ..... .....

TABLE_PHONE_NUM :
| NAME | PHONE_NUM | | aaa | 080-AAAA-YYYY | | bbb | 080-BBBB-YYYY | | ccc | 080-CCCC-YYYY | | ddd | 080-DDDD-YYYY | ..... .....

ここで、TABLE_MEMBERDATAに新しいフィールド 'New_Field ' を追加してそこにそれぞれの'NAME'に対応する電話番号を一括でコピーして以下のような状態にしたい。

TABLE_MEMBERDATA:
| ID | NAME | New_Field | | 001 | aaa | 080-AAAA-YYYY | | 001 | bbb | 080-BBBB-YYYY | | 001 | ccc | 080-CCCC-YYYY | | 001 | ddd | 080-DDDD-YYYY | ..... .....

このときは以下のようにUPDATEすればすべての行を一括で更新できる。

update TABLE_MEMBERDATA
set New_Field =
(select PHONE_NUM from TABLE_PHONE_NUM
where TABLE_PHONE_NUM.NAME = TABLE_MEMBERDATA.NAME)



SQL 重複したデータのSELECT

テーブルからあるフィールドの値が重複している行を取り出したいとき。

たとえば、TABLEAというテーブルの’Field1’,’Field2’に以下のように重複したデータが入っているとする。

 | Field1 | Field2 |  | 001 | aaa |  | 002 | bbb |  | 003 | ccc |  | 004 | ddd |  | 005 | aaa |  | 006 | bbb |

このなかで'Field2'で値が重複している列のみをSELECTしたい。

まず、'Field2'の重複している値のみを取り出すためには以下のように GROUP BY と HAVING を使って SELECT する。

select Field2 from TABLE_A
group by Field2 having COUNT( Field2 ) > 1

結果:  | Field2 |  | aaa | | bbb |

さらに、上記で取得した値を含んでいる列をすべて取得する。このときINを使う

select Field2 from TABLE_A where Field2 in
(select Field2 from TABLE_A
group by Field2 having COUNT( Field2 ) > 1)

結果:  | Field1 | Field2 |  | 001 | aaa |  | 002 | bbb |  | 005 | aaa |  | 006 | bbb |

2012/05/31

.NET データグリッドで行が追加できないと思ったら。。

以下のようにデータグリッドに行を追加するコードを書いてもどうしても Rows.Add() のところで落ちてしまうという現象に遭遇。

Dim iId as Integer = DataGridView1.Rows.Add()
DataGridView1.Rows(iId).Cells("ColumnA").Value = "AAAA"
.....

いろいろプロパティを変えてみたが解決されず、AllowUserToAddRows = false になっていたので、これをtrueにしたら、上記のコードをすべてコメントアウトしてもデータグリッドビューを描画しようとする時点でエラーで落ちてしまう。

原因を探っていたら、CurrentCellChangedイベントの処理が記述されているのでデータグリッドに列を追加するときにこのイベントが発生していることがわかった。

その中で DataGridView1.CurrentRow().Index を取ろうとしていたところで落ちていたことが判明。

If DataGridViewTani.CurrentRow() Is Nothing Then Return End If dim iCurrentRowIdx as Integer = DataGridViewTani.CurrentRow().Index 'ここで落ちてた dim strTmp as String = DataGridViewTani.Rows(iCurrentRowIdx).Cells("ColumnA").Value


CurrentCellChangedイベント処理内を以下のように修正したら正常に行が追加されるようになった。

If DataGridViewTani.CurrentRow() Is Nothing Then Return End If dim iCurrentRowIdx as Integer = DataGridViewTani.CurrentRow().Index 'これを追加 If iCurrentRowIdx > 0 Then dim strTmp as String = _ DataGridViewTani.Rows(iCurrentRowIdx).Cells("ColumnA").Value End If

イベント処理は全部チェックしましょう。。

VB.NET 日付の比較をする

日付の比較。date.compare を利用する。が、いつも戻り値が分からなくなるのでメモ。

dim iRet as Integer = Date.Compare(date1,date2)

結果
iRet = -1 : date1 < date2
iRet = 0 : date1 = date2
iRet = 1 : date1 > date2


同一テーブル内の違うフィールドにデータをコピーする

あるテーブルに新しくフィールドを追加した場合などで、すでにある同じ行のあるフィールドのデータをそのままコピーしたい場合のSQL。

たとえば、TABLE_A に次のようにデータが入っているとする。

| Field1 | Field2 | Field3 | | 001 | abcd | 22 | | 001 | dnkda | 34 | | 001 | tsgt | 9 | | 001 | lanhp | 13 |

このテーブルに 'Field4' というフィールドを追加してそのフィールドに次のように 'Field3' の値をコピーしたいときの処理にすこし手間取ったのでメモしておく。

| Field1 | Field2 | Field3 | Field4 | | 001 | abcd | 22 | 22 | | 001 | dnkda | 34 | 34 | | 001 | tsgt | 9 | 9 | | 001 | lanhp | 13 | 13 |

まず、'Field4' の初期値を決めて、すべての列に初期値を入れておく。今回の場合 '0' をセット。

| Field1 | Field2 | Field3 | Field4 | | 001 | abcd | 22 | 0 | | 001 | dnkda | 34 | 0 | | 001 | tsgt | 9 | 0 | | 001 | lanhp | 13 | 0 |

この状態の TABLE_A にたいして以下のSQL文を実行することで解決。

update TABLE_A set Field4 = Field3 where Field4 = 0



単純なのに、案外てこずってしまった。。

2012/04/06

localhost の IPアドレスを調べる方法

コマンドプロンプトで #ipconfig でローカルエリア接続のIPアドレスを調べる

2012/02/20

MaskedTextBox からの文字列の取得の仕方を変更する

MaskedTextBox のTextMaskFormatプロパティを変更することで、どのように文字列を取得するかを 変更できる。

たとえば、MaskedTextBoxA に"____年__月__日" というマスクを設定して、テキストボックスに"2012年02月20日"と入力された場合

フォーマット文字列を除いて取得:

MaskedTextBoxA.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
strInput = MaskedTextBoxA.text
strInput:"20120220"



フォーマット文字列を含めて取得:

MaskedTextBoxA.TextMaskFormat = MaskFormat.MaskFormat.IncludeLiterals strInput = MaskedTextBoxA.text
strInput:"2012年02月20日"


となる。

2012/01/23

VB.NET StringBuilderクラス

http://msdn.microsoft.com/ja-jp/library/ms172824.aspx

"StringBuilderクラスは、多くの文字列を結合する場合、&= 演算子よりも効率的です。"



"Stringと異なり、StringBuilderを利用すると文字列連結時にオブジェクトの再作成を行わないため、高速な文字列操作が行える。"

・StringBuilderは、クラスであるため、使用前にNewキーワードが必要となる。
・String型は、文字列の内容が変わる度にオブジェクトを再作成する。
・StringBuilderは、文字列の内容が変わってもオブジェクトを再作成することはない。
・StringBuilderを初期化する場合には、オブジェクト名.Length = 0とすれば良い。

とのこと。

2012/01/12

過程とかって物をつくるときやっぱ大事なんだな、、と思わされた件

少し前のGigazineさんの記事で多分結構読まれている記事なので、いまさら、、という感じではあるが、すごく納得した部分があったので一応メモ。

日本では設計段階で車の模型は粘土で作るけど、イタリアの車は木みたいな硬い素材を使って模型を作るらしい。

堅い素材でものを作るとできあがるものも実は堅く見える。粘土みたいな柔らかい素材でものを作るとできあがるものも実は非常に柔らかく見える。

のだそうだ。なるほどだ。

何を使って考えるかって、実は結構大事で、それが最終的な形にまで反映されるのかもしれない、、と考えさせられた。

そういえば、最近PCばかりじゃなくて考えるとき紙と鉛筆をつかって考えないと考えがまとまらないことがあったりする。

あとは紙で読んだものとディスプレーを通して読んだものって情報の残り方がなんか違う。

もしかしたら、単に眼精疲労がすさまじくなってきたということなのかもしれないけど、、、なんか関係がある気がした寒い冬の朝。