.NETで、ダイアログフォームなど子画面からの戻り値を条件によって変更する。

通常は、buttonコントロールのDialogResultプロパティで、戻したい結果を設定すれば良いので大変楽ですが、
なんらかの入力値や状態によっては、違う結果を戻したいこともあるかと思います。

その場合は、FormClosingイベント内で以下のように書く幸せです。

[VBの場合]

private _isComplete as Boolean '判定の為のフラグ

Private Sub dlg001_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing

    If (_isComplete = true) Then
        Me.DialogResult = Windows.Forms.DialogResult.OK
    Else
        Me.DialogResult = Windows.Forms.DialogResult.ReTry
    End If

End Sub

.NETで画面に張り付けたコントロールを、コントロール名の文字列で探したい

なんらかの動的に状態が変わるような処理をして、それを画面に反映する時に、
画面のコントロールオブジェクトを文字列で探せたら便利なのに・・・とか思うことがたまにある。

.NETならリフレクションを使えばこういったことも可能ですが、もうちょっと簡単に済ませたい場合・・・
Controls.Findメソッドが素敵な結果をもたらしてくれる。

’探したいコントロール名の文字列
Dim ctrlName As String = "EVA-02"
’コントロールの検索
Dim ctrls As Control() = Me.Controls.Find(ctrlName, true)
’ない場合はメソッドを抜けたりする。
If ctrls.Length = 0 Then Return

’キャストしてなんらかの処理を行う
DirectCast(ctrls(0), TextBox).Text = "ASUKA"

色々と応用が利くので便利。

SQLの問合せで、COUNTの結果が0件のデータを取得する。

環境:SQLServer

例えば・・・、

SELECT COUNT(*) AS cnt, Col_1 FROM Table_1 WHERE ~ GROUP BY Col_1

という事をやった際に、条件によっては行が抽出されない。
抽出されないということは、「0件」という結果を取得したくてもできない・・・

0件なら0件と返してほしいのです・・・
という切なる願いを叶えるには、もう一工夫してみると幸せ。

そこで・・・

SELECT COUNT(*) AS cnt
FROM
(
SELECT Col_1 FROM Table_1 WHERE ~ GROUP BY Col_1
) A

といったように副問合せで囲むと、結果0件がなにやら取得できます。

VisualStudio2010 ExpressとProfessionalの同居

OSの環境は、windows7 Pro 64bit

VisualStudio2010の環境はExpressでいろいろとインストール済み。
Visual Basic2010 Express
Visual C#2010 Express
Web Developper 2010 Express
VisualStudio2010 Express for WindowsPhone
・・・などなど、色々入っている状態

そんな状態だったけど、VS2010 Professionalをインストールすることになった。
まずExpress版の環境を残す必要があるかが問題だけど、今回は残したかった。
でも、そもそも同居できるのだろうか・・・
ちょこっとだけ調べても、それらしい情報が見当たらない。

よくわからないけど、きっと同居してても大丈夫なのかも・・・とか思ってインストール強行
ちなみにインストール項目は「すべて」を選択して実行。
やたら長い・・・

とりあえず終わったところで、WindowsUpdateで更新プログラムを適用。
その後、VisualStudio2010 SP1を適用.
これも長い・・・

結果としては 「本当に問題なく同居してる」・・・っぽい。
ぽい、というのは当然、あらゆる全ての検証は出来ないからだけど、とりあえず今のところは問題なく動いてる。

Expressで作ったソリューションは、右クリックのプロパティでプログラムを「Professional」に変更した。

SQLServer2008の「上位200行を編集」を何とかする。

対象はSQLServer2008以降の「SQL Server Management Studio」
このGUI上でテーブルを開き直接編集しようとする際に、SQLServer2005以前なら意識せずに全行が編集対象として開かれていたが、2008以降は「上位200行の編集」という項目になっており、初期状態だと200行に編集行が制限されている・・・。

メリットが有ることもわかるけど、これまでのSQLServerに慣れていると、非常に違和感がある。。。

解決は以下で。
1.SQL Server Management Studioのメニューバーから「ツール」を選択
2.次に「オプション」を選択
3.「SQLServer オブジェクトエクスプローラ」という項目を選択
4.そこに「上位行の編集コマンドの値」という項目があるので、そこを任意の値にする。
 0にするとすべての行が対象となる。

これでめでたく操作がスムーズになりましたとさ。

VMWare Playerのアップデートに失敗

ホスト環境 Windows7pro 64bit

4.0.2にアップデートするため、VMWareのウィザードに従って作業。
ところが、旧バージョンのアンインストールが行われPC再起動をしてデスクトップが上がった後に、
「UIが~」どうのというメッセージボックスが表示されてアップデートに失敗した。

エラー発生タイミングは再起動後なので、一応は切れのいいところではあるのだろうけど・・・

ProgramFiles(x86)のVMWareフォルダの中を見ても空っぽ。
削除まではきれいにいったのだろうという判断で、アップデート作業中にダウンロードされたバージョン4.0.2のファイルを探してみた。

C:\Users\[ユーザー名]\AppData\Local\VMware\vmware-download-16F0\cdstmp_player-windows_4.0.2_591240

このフォルダ内に
VMware-player-4.0.2-591240.exe
tools-windows-8.8.2.exe
の二つが入っていたので、「VMware-player-4.0.2-591240.exe」を実行。

インストールが行われ、PC再起動後にVMWareを実行してみると問題なく起動した。

ゲストOSを起動してみると、Toolsのアップデートを促すメッセージが画面下部に出ていたので
それも実行。ゲストOS再起動で無事にアップデート完了。

DataGridViewで右クリックで選択状態にし、かつコンテキストメニューを表示

.NETのDataGridView上で右クリックを行った場合、左クリックの時のような選択状態にならない・・・。

これの対応は、CellMouseClickイベントで行う。以下VBでの例

Private Sub dgvData_CellMouseClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvData.CellMouseClick

If (e.RowIndex < 0) Then Return
If (e.ColumnIndex < 0) Then Return

' 右ボタンクリック判定
If e.Button = MouseButtons.Right Then

' クリックされたセルの特定
Dim cell As DataGridViewCell = dgvData(e.ColumnIndex, e.RowIndex)

' セルを選択状態にする。
cell.Selected = True

End If

End Sub

選択状態を作り出すだけなら上記のCellMouseClickイベントで良いけど、ここで同時にContextMenuStripの表示を行いたい場合は、
CellMouseClickイベントではなく、CellContextMenuStripNeededイベントを使用する。

Private Sub dgvData_CellContextMenuStripNeeded(sender As System.Object, e As System.Windows.Forms.DataGridViewCellContextMenuStripNeededEventArgs) Handles dgvData.CellContextMenuStripNeeded

If (e.RowIndex < 0) Then Return
If (e.ColumnIndex < 0) Then Return

' クリックされたセルの特定
Dim cell As DataGridViewCell = dgvData(e.ColumnIndex, e.RowIndex)

' セルを選択状態にする
cell.Selected = True

End Sub

後は、それぞれ必要な処理を入れておけばいい。

Office365を使い始めてみる

個人的な興味の為にOffice365を契約。

今日は少しいじっていたのだけれど、とっても高機能 。

ローカルのOfficeソフトと連動するだけでなく、
エクスプローラとも連動可能。
ドキュメントライブラリにファイルをアップロードするには、このほうが便利。
ただし、ファイル名に「~」が入っていると、Office365にアップロードできないっぽい。

試しに、ブラウザ上で「化物語~偽物語」というWordファイルを作ってみたけど、
これは大丈夫っぽい。
アップロードする時だけ「~」が含まれると駄目っぽいかも。

 

ネットワーク探索が有効にならない

WindowsServer2008R2でPrivate扱いのネットワークであるにも関わらず、
ネットワーク探索が有効にならない現象が発生

ファイアウォールも標準状態。
ローカルセキュリティポリシーの「ネットワークリストマネージャ ポリシー」も標準状態。

紆余曲折の末、以下のサービスを開始したら、ネットワーク探索が有効にできた。

  • SSDP Discovery
  • UPnP Device Host

なかなか絶妙な感じ。

Windows7などでは当たり前に出来ていたので、少々調査に時間がかかった。

IS02の同期がうまくいかない

修理に出していたIS02は、すぐに戻ってきたけれど、WindowsPCとの同期がいまいち。
自宅のPCでも、会社に置いてあるノートPCでも同様なので、Windows側の問題じゃなく
IS02側の問題でしょう。

ちなみに液晶が壊れる前は、こんな現象はなく便利に同期が使えていたのに・・・
同期対象を全て無しの状態から、再設定したら比較的切断されにくくなったけど
それでもこういったものは、普通繋がって当たり前だと思うので、
いずれは切れるというのでは都合が悪い。
時間がある時に、マスタクリアでどうなるか実験。

・・・と思ったけど、時間の無駄なのでBlueToothでの同期に変更
http://www.microsoft.com/ja-jp/windowsphone/forowners/help/100tips/config08_vista.aspx

同期時に「BlueToothで接続」を押さないと駄目っぽいからひと手間増えるけど
確実に繋がるならこのほうがいい。