VB.net

「VB.net」の編集履歴(バックアップ)一覧はこちら

VB.net - (2008/06/16 (月) 18:02:47) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

PageLastUpdate:&date()/today:&counter(today)/yesterday:&counter(yesterday) #openclose(show=クリックすると見出し一覧を表示します){ #contents() } オブジェクト指向から勉強中。ヘタレた内容だけど笑わないでね。 *&aname(自作クラスとか){自作クラスとか} |[[DataGridViewEx]]|2007/11/19|拡張DataGridView。列位置や幅のユーザー別の保存とか| |[[DataGridViewSynchronizer]]|2007/11/13|上下に並べたふたつのDataGridViewの列表示を同期させるクラス。| |[[WorkStationLockController]]|2007/07/16|PCのロックをしたりロック状態を取得するクラス| |[[DebugTimer]]|2007/07/23|デバッグ時に処理ごとのパフォーマンスを計測するクラス| *&aname(ESCキーで行の変更をキャンセルするDataGridView){ESCキーで行の変更をキャンセルするDataGridView} 2008/06/16 検索語:キーボード ショートカット エスケープ DataTable DataGridViewはESCキーで編集のキャンセルができないので、とりあえず作ってみた。 Bindしている行がDataRowViewにDirectCastできるのが前提条件です。 #highlight(vb.net){ Public Class DataGridViewEx Inherits DataGridView Private _rejectbyescape As RejectEscapeType = RejectEscapeType.None Public Enum RejectEscapeType As Integer None = 0 CurrentRow = 1 SelectedRows = 2 End Enum Public Property RejectByEscape() As RejectEscapeType Get Return _rejectbyescape End Get Set(ByVal value As RejectEscapeType) _rejectbyescape = value End Set End Property Private Sub DataGridViewEx_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown Try If e.KeyCode = Keys.Escape Then '編集モードではなくReadOnlyでもなければRejectChangesを実行 '(グリッドがReadOnlyのときはCurrentRowも自動的にReadOnlyになるのでCurrentRowだけで判定してOK) If (IsCurrentCellInEditMode = False) And (CurrentRow.ReadOnly = False) Then Select Case _rejectbyescape Case RejectEscapeType.CurrentRow DirectCast(Me.CurrentRow.DataBoundItem, DataRowView).Row.RejectChanges() Case RejectEscapeType.SelectedRows For Each dgvr As DataGridViewRow In SelectedRows DirectCast(dgvr.DataBoundItem, DataRowView).Row.RejectChanges() Next End Select End If End If Catch ex As Exception MessageBox.Show(ex.ToString & ex.Message) End Try End Sub End Class } *&aname(Microsoft Visual Studio International Pack 1.0){Microsoft Visual Studio International Pack 1.0} 2008/04/11 http://www.microsoft.com/downloads/details.aspx?FamilyID=f9cfc884-1f00-45fa-b2fb-303d9e110bc7&DisplayLang=ja |East Asia Numeric Formatting Library|数値データを日本語、繁体字中国語、簡体字中国語および韓国語における漢数字の文字列に変換します。| |Japanese Kana Conversion Library|ひらがな、カタカナ、半角カタカナの相互変換、およびローマ字の変換をします。| |Japanese Text Alignment Library|日本語固有の均等割付を用いて文字列を描画します。| |Japanese Yomi Auto-Completion Library|日本語IME における読みの入力に対応したオートコンプリート機能を提供するライブラリとサンプルのTextBox コントロールを提供します。| *&aname(My.Settingsの構成ファイルの場所を取得する。){My.Settingsの構成ファイルの場所を取得する。} 2008/03/25 検索語:exe.config、user.config、ApplicationSettingBase アプリケーション構成ファイル #highlight(vb.net){System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile} ユーザー構成ファイル #highlight(vb.net){ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath} ネタ元:http://www.atmarkit.co.jp/fdotnet/dotnettips/558appsettings/appsettings.html ちなみに同一記事にもかかれているが、2005ではローミングユーザーであってもローカルユーザーのユーザー構成ファイルが使われてしまうようだ。せっかくローミングにも対応するように設計したつもりだったけど意味無い・・・。 別課題:過去の設定ファイル消せないと気持ち悪い。 *&aname(Partial Classをメインのクラスのツリー下に配置する){Partial Classをメインのクラスのツリー下に配置する} 2008/03/24 projファイルの中から目的の分割クラスの記述を見つけ、DependentUpon行を追加すればOK。 #highlight(vb.net){<Compile Include="MainForm.Menu.vb"> <DependentUpon>MainForm.vb</DependentUpon> '←この行を追加 <SubType>Form</SubType> </Compile>} SubTypeは消してもVisual Stdio上で一回開いて保存すると元に戻る。 *&aname(C#→VB.netへのコード変換サービス){C#→VB.netへのコード変換サービス} 2008/03/24 http://codeconverter.sharpdevelop.net/Convert.aspx 使ってみた中ではコレが一番だった。 *&aname(Visual Studio 2005 SP1 統合 installer の作成方法){Visual Studio 2005 SP1 統合 installer の作成方法} 2008/01/30 http://blogs.wankuma.com/tyappi/archive/2008/01/05/116016.aspx *&aname(再帰的にコントロールの親をたどって、ピリオド区切りでパスを返す関数){再帰的にコントロールの親をたどって、ピリオド区切りでパスを返す関数} 2008/01/21 例えばForm1のPanel1に乗っているTextbox1なら Form1.Panel1.TextBox1 と帰ってきます。 #highlight(vb.net){ Public Function ControlPath(ByVal ctl As Control) As String Try If ctl.Parent Is Nothing Then Return ctl.Name Else Return ControlPath(ctl.Parent) & "." & ctl.Name End If Catch ex As Exception MessageBox.Show(ex.ToString) Return "" End Try End Function} *&aname(VBScriptのエラーコードメモ){VBScriptのエラーコードメモ} 2007/12/25 Descriptionが定義されていないものがある。一覧が見つけられない・・・。誰か教えて。 |エラーコード|内容|h |-2147024843|たぶんネットワークパスが見つからないとき。| *&aname(Visual Studio 2008 Express Edition){Visual Studio 2008 Express Edition} 2007/12/18 ついにきました。まあいきなりインストールするわけにもいかないから、遊ぶのは正月休みですね。不具合情報の様子見でw なんと窓の杜から落とせるよ。 http://www.forest.impress.co.jp/lib/stdy/program/progdevenv/vbexedition.html ……と思ったら違いました。ダウンロード先は「作者サイト」になってるのね。 *&aname(チェックボックスでスプリットコンテナのパネルの表示をOn/Offする){チェックボックスでスプリットコンテナのパネルの表示をOn/Offする} 2007/12/06 検索語:CheckBoxでSplitContainerのPanelをOn/Off、反転、True、False SplitContainerのパネルを片側消したかったけど、Visibleでスプリッタが動いてくれないので「なんで?」と探したらPanel1Collapsed/Panel2Collapsedというわかりにくいプロパティでした。ヘルプには「縮小または展開するかどうかを決定する値を取得または設定します。」と書いてある。表現がわかりにくいっちゅうの。 で、チェックボックスをOnにしたときに表示、Offにしたときに非表示にしたいんだけど、CheckedとCollapsedの単純バインディングだと逆になってしまうので、Bindingオブジェクトの拡張クラスをつくってみた。 #highlight(vb.net){Private Class BindingReverseBoolean Inherits Binding Public Sub New(ByVal propertyName As String, ByVal dataSource As Object, ByVal dataMember As String) MyBase.New(propertyName, dataSource, dataMember, False, Windows.Forms.DataSourceUpdateMode.OnPropertyChanged) End Sub Private Sub BindingReverseBoolean_Format(ByVal sender As Object, ByVal e As System.Windows.Forms.ConvertEventArgs) Handles Me.Format e.Value = Not e.Value End Sub Private Sub BindingReverseBoolean_Parse(ByVal sender As Object, ByVal e As System.Windows.Forms.ConvertEventArgs) Handles Me.Parse e.Value = Not e.Value End Sub End Class} で、FormのLoadでこんな感じに使います。 #highlight(vb.net){myCheckBox.DataBindings.Add(New BindingReverseBoolean("Checked", mySplitContainer, "Panel2Collapsed"))} どうもバインディングオブジェクトは [Checked]⇒True=Format=False⇒[Collapsed]⇒False=Parse=True⇒[Checked] こういう感じに動くようだ。2回値がセットされる感じ。 今回は自分で使うだけで、絶対にBoolean以外がこないのはわかっているのでエラー処理はなし。 余裕があれば汎用的なクラスにしたいので、プロパティの型チェックとかいれる予定。 *&aname(配列をリストに変換する){配列をリストに変換する} 2007/11/18 リストを配列に変換するのはToArrayで簡単。配列をリストに変換する方法がわからない・・・3時間ぐらい調べてやっと見つけた。 http://d.hatena.ne.jp/Seasons/searchdiary?word=*%5BC%23%5D わかってみれば簡単でリストのコンストラクタに渡せばよいだけでした・・・ Dim myArray As String() = {"A","B","C"} Dim myList As List(Of String) = New List(Of String)(myArray) 固定値の入ったリストを作るときもこのほうがラク。 つか、ちょっとデキる人は絶対わかってるよな。「リストを配列に変換する」で検索してどうにもひっかからないっていうのは何故。 *&aname(型比較でハマる){型比較でハマる} 2007/11/18 オブジェクトのプロパティを列挙する処理を書いていたら、PropertyTypeの型のチェックで エラー 5 型 'System.Type' の式を型 'String' にすることはできません。 のエラーが出て、いろいろ書き換えてみてもどうにも通らない。 原因は「型の比較はTypeOfだ」という思い込みでした。 #highlight(vb.net){For Each pi As PropertyInfo In target.GetType.GetProperties Select Case True Case TypeOf pi.PropertyType Is String '←ここがダメ ... Case Else ... End Select Next} ↓ #highlight(vb.net){For Each pi As PropertyInfo In target.GetType.GetProperties Select Case True Case pi.PropertyType Is GetType(System.Byte) '←これでOK ... Case Else ... End Select Next} TypeOfはオブジェクトと型を比較するのね。型どうしの直接比較ならIsだけでよい。 気づかなかったのが恥ずかしい・・・。 *&aname(NewGUIDを文字列にするときの引数){NewGUIDを文字列にするときの引数} 2007/11/10 よくわからなくなるのでメモ。xは16進数なので[0-9A-F]。 |GUID.NewGUID.ToString("N")|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|32桁| |GUID.NewGUID.ToString("D")|xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx|ハイフンで区切られた 32 桁| |GUID.NewGUID.ToString("B")|{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}|中かっこで囲まれ、ハイフンで区切られた 32 桁| |GUID.NewGUID.ToString("P")|(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)|丸かっこで囲まれ、ハイフンで区切られた 32 桁| *&aname(My.Settingsに連結したコントロール間でChangedイベントで値をやり取りすると値が書き戻されることがある){My.Settingsに連結したコントロール間でChangedイベントで値をやり取りすると値が書き戻されることがある} 2007/11/08 実際に起こったのはチェックボックスのChackedChangedでテキストボックスに値を書き込んだら、チェックボックスの値が再度My.Settingから読み出されて変更する前に戻ってしまう。 検索したらMy.Settingsの挙動不審がいくつか見つかるので、バインドしたコントロール間でやり取りはしないほうが無難。 2007/11/15 Microsoftにも正式文書がありました。 http://msdn2.microsoft.com/ja-jp/library/a65txexh(VS.80).aspx 現在、Windows フォームの一部のプロパティはバインドできません。わかりやすい例は ClientSize プロパティです。 このプロパティにバインディングすると、実行時に予期できない動作が発生します。 通常、設定をプログラムで保存して読み込むことでこの問題を解決できます。 *&aname(DataSet中の複数のテーブルをAccessのように連結して扱う){DataSet中の複数のテーブルをAccessのように連結して扱う} 2007/10/26 アクセスがクエリを元にフォームをつくれるので、同じことがVB.netでもできないかなと探していたら、DataTable間にリレーションを設定し、DataColumnのExpressionを設定することで実現できました。 #highlight(vb.net){ Private relationTest As System.Data.DataRelation Me.relationTest = New System.Data.DataRelation( _ "relationTest", New System.Data.DataColumn() {Me.tableA.ShohinCDColumn}, _ New System.Data.DataColumn() {Me.tableB.ShohinCDColumn}, _ false) Me.Relations.Add(Me.relationTest) Me.tableA.ShohinNameColumn.Expression = "Parent(rerarionTest).ShohinName" } DataGridViewの列で処理することばかり考えていて、DataTableそのものに列を追加するというのは、ちょっと思いつかなかったな。 いままでコードに対応する名称をDataGridView上で表示するのにわざわざコンボボックスを使っていたので、これでとてもラクになりました。 DataTableはアクセスのクエリの役目も果たしてくれるのですね。 ちなみにここにはコードで載せていますが、これはDataSetのDesiner.vbから拾ってきたもので、実際にはデザイナオンリー、ノンコーディングで実現できています。 *&aname(継承コントロールをデザイナで削除すると「インデックスが範囲を超えています」のエラー){継承コントロールをデザイナで削除すると「インデックスが範囲を超えています」のエラー} 2007/10/10 検索語:コンストラクタ Newの中でAddHandlerしたテキストボックスの継承コントロールで、デザイナで削除するときに インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 パラメータ名: index のエラーメッセージが出るようになってしまった。いろいろ調査した結果、原因はAddHandlerだと判明。 #highlight(vb.net){AddHandler DataBindings.CollectionChanged, AddressOf DataBindings_CollectionChanged} 最終的にはDisposeの中でRemoveHandlerを書くことで解決。 #highlight(vb.net){RemoveHandler DataBindings.CollectionChanged, AddressOf DataBindings_CollectionChanged} 似たようなことをやっている他の継承コントロールでは起きないので、解放するリソースの種類や内部処理に依存しそう。 まあ「Disposeするときにきちんとすべてのリソースを解放しましょう」というのは当たり前のことだから、いままでAddHandlerの後始末をやっていなかったのがダメなんでしょう。たぶん。 「AddHandlerしたら必ずRemoveHandlerしましょう」とか、教えてくれる人もいなかったし、どこかに書いてあるのかなぁ。 *&aname(継承したテキストボックスをフォームから削除しようとすると、エラーが出て削除されない。){継承したテキストボックスをフォームから削除しようとすると、エラーが出て削除されない。} 2007/08/27 インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 プロジェクトを開きなおすときちんと消えている。 継承したコントロールの中でやっている処理の問題だった。詳細な内容は後でかこう。 *&aname(ComboBoxに連結したDataTableが意図せずに変更される){ComboBoxに連結したDataTableが意図せずに変更される} 2007/10/04 検索語:コンボボックス/DataTable/DataView/DataSource/Bind/データが変わる DataTableにコンボボックスを連結したときに、既存データにコンボボックスに存在しない値が入っていると、レコードのCurrent時にコンボボックスの先頭の値に書き換えられてしまう。 FormattingEnabled をTrueにすることで解消できる。FormatString を設定する必要はない。 *&aname(Express Edition ではセットアップ用のmsiはつくれない){Express Edition ではセットアップ用のmsiはつくれない} 2007/08/07 確実な情報が見つからないけど、つくれないっぽい。 ↓こういうの見つけた。んー、個人でここまで踏み込むかどうするか。会社でやる分にはVS.net使えるからなぁ。 [[WiXではじめるWindows Installer作成入門>http://codezine.jp/a/article/aid/428.aspx]] *&aname(ComboBoxにはDoubleClickイベントがないのね){ComboBoxにはDoubleClickイベントがないのね} 2007/08/24 コンボボックスでDoubleClickイベントを使おうかと思ったらありませんでした。 *&aname(CSVの読み込み){CSVの読み込み} 日本語の露出が少ないけどXmlCsvReaderというのがよさそう。テストしてみよう。 *&aname(相手先別に添付ファイルを変更するメール送信ソフトを作ってみよう){相手先別に添付ファイルを変更するメール送信ソフトを作ってみよう} 2007/07/26 VB.netでメール送信するのは簡単そう。相手のアドレスと添付ファイルのリストから、メール送信するソフトを作ってみよう。 &strike(){http://www.atmarkit.co.jp/fdotnet/dotnettips/017sendmail/sendmail.html} ↑このアドレスは2003で、2005からはクラスが変わっていました。 http://www.microsoft.com/japan/msdn/vbasic/migration/tips/netmail/ 2007/07/28 うーん、SmtpClient はいろいろ問題がありそうな。POP before SMTPとかも自作しなきゃいかんし。 http://support.microsoft.com/default.aspx/KB/927858 2007/07/28 商用利用も含めてフリーライセンスのよさそうなライブラリを発見。 [[.NET用メール送受信クラスライブラリ (TKMP.DLL)>http://uwa.potetihouse.com/library/tkmpdll.html]] ライセンスについて http://uwa.potetihouse.com/bbs/patio.cgi?mode=view&no=139 自分で組めるようにもなりたいけど、とりあえず利用させていただいて、少しづつ力をつけよう。 *&aname(コンボボックスに高速にデータをBindする){コンボボックスに高速にデータをBindする} 2007/07/24 DataSourceよりもValueMemberとDisplayMemeberを先に指定したほうが速いようです。 設定するたびにリクエリがかかる感じですね。 特に件数の多いテーブルをBindするときに効果的です。 **DataSourceを先に設定した場合 #highlight(vb.net){ DebugTimer.WriteLine("Testスタート") cboSample.DataSource = New DataView(dt) '←先に設定 DebugTimer.WriteLine("DataSourceをセット") cboSample.ValueMember = "連結したい列名" DebugTimer.WriteLine("ValueMemberをセット") cboSample.DisplayMember = "表示したい列名" DebugTimer.WriteLine("DisplayMemberをセット") } |MEMO|00:00:000|00:00:000|Testスタート| |MEMO|00:00:272|00:00:272|DataSourceをセット| |MEMO|00:00:540|00:00:268|ValueMemberをセット| |MEMO|00:00:808|00:00:268|DisplayMemberをセット| **DataSourceを後に設定した場合 #highlight(vb.net){ DebugTimer.WriteLine("Testスタート") cboSample.ValueMember = "連結したい列名" DebugTimer.WriteLine("ValueMemberをセット") cboSample.DisplayMember = "表示したい列名" DebugTimer.WriteLine("DisplayMemberをセット") cboSample.DataSource = New DataView(dt) '←後に設定 DebugTimer.WriteLine("DataSourceをセット") } |MEMO|00:00:000|00:00:000|Testスタート| |MEMO|00:00:000|00:00:000|ValueMemberをセット| |MEMO|00:00:000|00:00:000|DisplayMemberをセット| |MEMO|00:00:296|00:00:296|DataSourceをセット| *&aname(Microsoft Win32 と Microsoft .NET Framework API との対応){Microsoft Win32 と Microsoft .NET Framework API との対応} 2007/07/16 http://www.microsoft.com/japan/msdn/net/general/win32map.aspx *&aname(2005でデザイナから自動生成されるDataTableでのDBNull){2005でデザイナから自動生成されるDataTableでのDBNull} 2007/07/16 XというフィールドにDBNullが来るよねと思ってIsDBNull(X)で判定しようとしたら蹴られた。 なんで?と思ってクラスを見たら、テーブルのメソッドにIsXNullっていうのが作られてた。 なるほど。Nullの可能性のあるフィールドはこれで判断しろと。 *&aname(タイマーとメッセージボックス){タイマーとメッセージボックス} 2007/07/16 メッセージボックスが出ているあいだもタイマーは動き続けているので、処理によっては固まる。注意。 *&aname(ワークステーションのロック){ワークステーションのロック} 2007/07/16 カンタンだった。 System.Diagnostics.Process.Start("rundll32.exe", "user32.dll,LockWorkStation") 2007/07/16 ロックかけるのは簡単だけど、ロックされているかどうかの判断が難しい。つか標準ではできない。 http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200612/06120018.txt Microsoft.Win32.SystemEventsのSessionSwitchを使うことで、 ロック開始のイベントとロック終了のイベントを受け取ることができます。 との情報を発見したので、ロック状態を管理しつつ、ロックをかけてくれるクラスを作成。 → [[WorkStationLockController]] 念のためsingletonをとっておく。singletonについては → http://hccweb1.bai.ne.jp/tsune-1/VisualBasic/singleton.html ちなみにsingletonをグローバル変数的に使うのはよくないというのは心しておく。 ワークステーションのロックについて調べていたら突き当たったサイト → http://www7a.biglobe.ne.jp/~lshen/EternalWindows/ GINAとか珍しいあたりをわかりやすく書いてくれてる。 フォアグラウンドウインドウを判定するのってAPI使うしかないのかなぁ。 → http://iseebi.half-done.net/?TechDoc%2FDetectionFullscreen *&aname(LDAPとActive Directoryの要素の比較){LDAPとActive Directoryの要素の比較} 2007/07/13 参考:http://publib.boulder.ibm.com/tividd/td/ITAME/SC32-1358-00/ja_JA/HTML/am51_webseal_devref101.htm |最大長|LDAP|Active Directory| |名 (LDAP CN)|256|64| |ミドル・ネーム|128|64| |姓|128|64| |レジストリー UID (LDAP DN)|1024|2048| |ユーザー・パスワード|制限無し|256| |ユーザー記述|1024|1024| |グループ名|256|| |グループ記述|1024|1024| |シングル・サインオン・リソース名|240|256| |シングル・サインオン・リソース記述|1024|1024| |シングル・サインオン・ユーザー ID|240|256| |シングル・サインオン・パスワード|制限無し|256| |シングル・サインオン・グループ名|240|256| |シングル・サインオン・グループ記述|1024|1024| |アクション名|1|1| |アクション記述、アクション・タイプ|制限無し|制限無し| |オブジェクト名、オブジェクト・スペース名、ACL 名、POP 名|制限無し|制限無し| |オブジェクト記述、オブジェクト・スペース記述、ACL 記述、POP 記述|制限無し|制限無し| *&aname(DirectorySearcher手ごわい){DirectorySearcher手ごわい} 2007/07/13 http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-33574.htm グループとユーザーの階層をノード的に取得しようとしたけど、手ごわい。 なんだよMemberofプロパティとかPrimaryGroupが取れないとか。 Microsoftのヘルプじゃまったくダメで、LDAPの仕様とか理解しないといけないところがツラい・・・ *&aname(System.DirectoryServices.DirectoryEntry.SchemaClassNameの一覧){System.DirectoryServices.DirectoryEntry.SchemaClassNameの一覧} 2007/07/12 ※とりあえず私が使ったものをメモっていきます。 |ユーザー|User| |グループ|Group| |コンピュータ|Computer| |サービス|Service| 検索をかけても一覧が見つからない・・・誰か教えて。 *&aname(SelectCommandでデータ書き込むストアド指定するとコミットされない・・・んー){SelectCommandでデータ書き込むストアド指定するとコミットされない・・・んー} 2007/07/10 DataAdapterのSelectCommandにデータの更新ありのストアドを投げると、戻ってきた結果は正しいのにデータベースには反映されてないみたい。 んー、いちいちコミットいれなきゃダメ? →mdfファイルが毎回コピーされてしまうためでした。 http://www.atmarkit.co.jp/fdotnet/dotnettips/532dbfilecopy/dbfilecopy.html *&aname(2005のヘルプにCrystal Reportのヘルプを追加とか){2005のヘルプにCrystal Reportのヘルプを追加とか} 2007/07/09 http://salv.miscnotes.com/2005/01/tips5_vsnethelphelp.php *&aname(TreeView使ってみた){TreeView使ってみた} 2007/07/04 便利。同じTreeNodeオブジェクトを別のツリーに追加することはできなかった。 *&aname(アップキャストとダウンキャスト){アップキャストとダウンキャスト} 2007/06/14 |アップキャスト|派生クラス→基本クラス|常にOK| |ダウンキャスト|基本クラス→派生クラス|やらないほうがよい。できないこともある。| ダウンキャストについてはちょっと勉強したほうがよさそうだ。 *&aname(IIFとdecimalでハマる){IIFとdecimalでハマる} 2007/06/12 DataTable.ColumnのExpressionを使用していて、floatだったフィールドをdecimalに変更したら何故か0除算のエラー。 IIF([分母]=0,0,[分子]/[分母]) とやって0除算をしてないはずなのに・・・・・・と半日ハマる。結論は IIFは真も偽も計算してから値を返すから IIFは普段は危険だから使わないんだけど、floatのときにエラーにならなかったので見落としました。 floatは0除算でエラーを返さないのね。 でもExpressionの中ってIIFしか条件式が使えない。やむをえず [分子]/CAST([分母],'System.Double') として回避。 *&aname(GrapeCity FlexGrid for .NET 2.0J){GrapeCity FlexGrid for .NET 2.0J} ダメだこれ。もうイヤ。 何がダメって、ColumnオブジェクトのNameプロパティが連結先のDataTableの列名。 で、複数のColumnに同じNameが設定できる。だからIndex以外で列を特定する術がない。 なのに、列位置を移動するとIndexが変わる。 頼むからNameは固有値にしてMappingName を指定させてくれ。 誰だこんなコントロール使うことにしたのは。二度と使わない。 いや、最新は4.0Jだから、よくなってるのかもしれないけれど。 *&aname(VB.Netに関する資料){VB.Netに関する資料} 2007/04/22 オブジェクト倶楽部 http://www.objectclub.jp/ ここのトレーニングテキストが死ぬほど役立つ。入門用とリファレンスのちょうど中間あたりの本になりにくいあたりが解説されている。 2007/05/13 ちょっと見ようと思ったら見つけられない。C#のページにありました。 http://www.objectclub.jp/technicaldoc/c/training.pdf 2007/04/29 .NETでの正規表現の使用法 http://japan.internet.com/column/developer/20050822/28.html 2007/05/01 コンテキストメニューまわり http://vbdotnet.fc2web.com/vbnet/control/ContextMenuMenu.htm *&aname(ArrayListとList){ArrayListとList} 2007/04/22 自作クラスのコレクションを作れるに違いないと思って、ArrayListを調べて2時間。 どうしても型指定したコレクションがつくれないよー(。´Д⊂) と、泣きそうになったところでListに気がつく。 あまりにも最初にArrayListに慣れ親しんだために、それ以外思い浮かばなかった失敗。 2007/05/24 Listって.net 2005(Framework 2.0)からなので。自宅は2005、会社は2003なので、会社で使おうとして使えなくてがっかり。 *&aname(プロパティにオブジェクトを設定したときにNewのタイミング){プロパティにオブジェクトを設定したときにNewのタイミング} 2007/04/22 プロパティ用のローカル変数に Private _objectname As Objecttype と宣言していてハマる。 Private _objectname As New Objecttype きちんとインスタンス意識しないとね。 *&aname(自分自身と同じ型のコレクションをプロパティに持つ){自分自身と同じ型のコレクションをプロパティに持つ} Private _childnodes As New List(Of LogNode) Public Property ChildNodes() As List(Of LogNode) Get Return _childnodes End Get Set(ByVal value As List(Of LogNode)) _childnodes = value End Set End Property ---- 2007/04/22 とりあえず2日間ざっくり勉強して2日間ざくざく組んだら、少し勘が働いてきた。 言語って、あるレベルまでいかないと、目の前が開けないよね。一回開けてくると調査スピードも速くなる。 *&aname(DateTimeメモ){DateTimeメモ} 2007/04/27 DateTimeの中身は#1/1/0 00:00:00#(西暦0年1月1日)からの経過ミリ秒 javascriptと値がずれるなと思ったら、javascriptは#1970/01/01 00:00:00#からの経過ミリ秒でした。 で、それでも誤差が32400ミリ秒出るので何かと思ったら、32400/60/60=9、ということで標準時との差。 *&aname(再帰型のクラスでちょっとはまったこと){再帰型のクラスでちょっとはまったこと} クラスを通過するたびにカウントアップするような引数は参照渡しすること。 *&aname(ライブラリメモ){ライブラリメモ} |ファイルパスの分解|System.Io.Path|ディレクトリ名はディレクトリを指定すればFileNameで取得できる| ||.GetExtension|戻り値はピリオド付き| |ファイルの検索|System.Io.Directory|戻り値はString()| |ファイル情報|My.Computer.FileSystem.GetFileInfo|| ||.Length|ファイルサイズの単位はバイト| |正規表現|System.Text.RegularExpressions|Regex.Match(Path.GetFileNameWithoutExtension(file), "^\d{1,5}$").ToString| |後方参照で置換||.Replace(対象文字列,"<a href="http://~">(.*?)</a>","$1")| |ファイル名に使えない文字を置換||mystring=Regex.Replace(mystring, "[\\\/:,;*?""<>&#124;]", "_")| |文字コード|System.Text.Encoding.GetEncoding("SHIFT-JIS")|| *&aname(LinkLabel){LinkLabel} なんかハイパーリンクを使いたかったのでざくっと調べたらLinkLabelっていうコントロールがある。 テキストいれればクリックで勝手にブラウザ呼んでくれるのかと思ったら、呼び出しも書かなきゃいけないし、訪問済みかどうかも自分で設定しなきゃいけないみたい。不便。自分で変更できるのはありがたいとして、最初からブラウザと同期してくれてもいいと思うんだけど、なんでだろう。 まあ複数リンクも扱えるけど、もっとこう、さくっと。 *&aname(ハッシュテーブル){ハッシュテーブル} 2007/05/16 Addは使わなくても良い。 >指定したキーがハッシュテーブルに存在しない場合には、新しい要素として登録される。 >キーがすでに存在する場合には、インデクサではそのキーに対応する値が置き換えられるが、Addメソッドでは例外が発生する。 *&aname(With Nothingを使って変数を局所化){With Nothingを使って変数を局所化} 2007/05/16 http://blogs.wankuma.com/jeanne/archive/2006/11/07/43926.aspx Sub Hoge With Nothing dim i as integer 処理 End With With Nothing dim i as integer 処理 End With End Sub みたいな形で変数のスコープを短くして使いまわせるという話。 *&aname(共有メンバ){共有メンバ} 2007/05/17 ヘルプより >既定では、クラスのデータはクラスの各インスタンスに固有になります。ただし、1 つのクラスから作成したすべてのオブジェクト間で、1 つのデータ項目を共有する方が都合のよい場合もあります。このような場合には、Shared 修飾子を使用して、変数の同じ値をクラス内のすべてのインスタンスで共有できるようにします (共有メンバは、他のプログラミング言語では "静的メンバ" と呼ばれる場合もあります)。共有メソッドは、事前にクラスのインスタンスを作成しなくても、クラス名を使用して直接呼び出すことができます 参考:http://blogs.wankuma.com/torikobito/archive/2007/04/04/70121.aspx *&aname(よくつかうリンク){よくつかうリンク} 2007/05/29 [[Visual Studio User Group>http://vsug.jp/]] ---- *comment このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。 #comment_num2 ----
PageLastUpdate:&date()/today:&counter(today)/yesterday:&counter(yesterday) #openclose(show=クリックすると見出し一覧を表示します){ #contents() } オブジェクト指向から勉強中。ヘタレた内容だけど笑わないでね。 *&aname(自作クラスとか){自作クラスとか} |[[DataGridViewEx]]|2007/11/19|拡張DataGridView。列位置や幅のユーザー別の保存とか| |[[DataGridViewSynchronizer]]|2007/11/13|上下に並べたふたつのDataGridViewの列表示を同期させるクラス。| |[[WorkStationLockController]]|2007/07/16|PCのロックをしたりロック状態を取得するクラス| |[[DebugTimer]]|2007/07/23|デバッグ時に処理ごとのパフォーマンスを計測するクラス| *&aname(ESCキーで行の変更をキャンセルするDataGridView){ESCキーで行の変更をキャンセルするDataGridView} 2008/06/16 検索語:キーボード ショートカット エスケープ DataTable DataGridViewはESCキーで編集のキャンセルができないので、とりあえず作ってみた。 Bindしている行がDataRowViewにDirectCastできるのが前提条件です。 #highlight(vb.net){ Public Class DataGridViewEx Inherits DataGridView Private _rejectbyescape As RejectByEscapeType = RejectByEscapeType.None Public Enum RejectByEscapeType As Integer None = 0 CurrentRow = 1 SelectedRows = 2 End Enum Public Property RejectByEscape() As RejectByEscapeType Get Return _rejectbyescape End Get Set(ByVal value As RejectByEscapeType) _rejectbyescape = value End Set End Property Private Sub DataGridViewEx_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown Try If e.KeyCode = Keys.Escape Then '編集モードではなくReadOnlyでもなければRejectChanges '(グリッドがReadOnlyのときはCurrentRowも自動的にReadOnlyになるのでCurrentRowだけで判定してOK) If (IsCurrentCellInEditMode = False) And (CurrentRow.ReadOnly = False) Then Select Case _rejectbyescape Case RejectByEscapeType.CurrentRow DirectCast(Me.CurrentRow.DataBoundItem, DataRowView).Row.RejectChanges() Case RejectByEscapeType.SelectedRows For Each dgvr As DataGridViewRow In SelectedRows DirectCast(dgvr.DataBoundItem, DataRowView).Row.RejectChanges() Next End Select End If End If Catch ex As Exception MessageBox.Show(ex.ToString & ex.Message) End Try End Sub End Class } *&aname(Microsoft Visual Studio International Pack 1.0){Microsoft Visual Studio International Pack 1.0} 2008/04/11 http://www.microsoft.com/downloads/details.aspx?FamilyID=f9cfc884-1f00-45fa-b2fb-303d9e110bc7&DisplayLang=ja |East Asia Numeric Formatting Library|数値データを日本語、繁体字中国語、簡体字中国語および韓国語における漢数字の文字列に変換します。| |Japanese Kana Conversion Library|ひらがな、カタカナ、半角カタカナの相互変換、およびローマ字の変換をします。| |Japanese Text Alignment Library|日本語固有の均等割付を用いて文字列を描画します。| |Japanese Yomi Auto-Completion Library|日本語IME における読みの入力に対応したオートコンプリート機能を提供するライブラリとサンプルのTextBox コントロールを提供します。| *&aname(My.Settingsの構成ファイルの場所を取得する。){My.Settingsの構成ファイルの場所を取得する。} 2008/03/25 検索語:exe.config、user.config、ApplicationSettingBase アプリケーション構成ファイル #highlight(vb.net){System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile} ユーザー構成ファイル #highlight(vb.net){ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath} ネタ元:http://www.atmarkit.co.jp/fdotnet/dotnettips/558appsettings/appsettings.html ちなみに同一記事にもかかれているが、2005ではローミングユーザーであってもローカルユーザーのユーザー構成ファイルが使われてしまうようだ。せっかくローミングにも対応するように設計したつもりだったけど意味無い・・・。 別課題:過去の設定ファイル消せないと気持ち悪い。 *&aname(Partial Classをメインのクラスのツリー下に配置する){Partial Classをメインのクラスのツリー下に配置する} 2008/03/24 projファイルの中から目的の分割クラスの記述を見つけ、DependentUpon行を追加すればOK。 #highlight(vb.net){<Compile Include="MainForm.Menu.vb"> <DependentUpon>MainForm.vb</DependentUpon> '←この行を追加 <SubType>Form</SubType> </Compile>} SubTypeは消してもVisual Stdio上で一回開いて保存すると元に戻る。 *&aname(C#→VB.netへのコード変換サービス){C#→VB.netへのコード変換サービス} 2008/03/24 http://codeconverter.sharpdevelop.net/Convert.aspx 使ってみた中ではコレが一番だった。 *&aname(Visual Studio 2005 SP1 統合 installer の作成方法){Visual Studio 2005 SP1 統合 installer の作成方法} 2008/01/30 http://blogs.wankuma.com/tyappi/archive/2008/01/05/116016.aspx *&aname(再帰的にコントロールの親をたどって、ピリオド区切りでパスを返す関数){再帰的にコントロールの親をたどって、ピリオド区切りでパスを返す関数} 2008/01/21 例えばForm1のPanel1に乗っているTextbox1なら Form1.Panel1.TextBox1 と帰ってきます。 #highlight(vb.net){ Public Function ControlPath(ByVal ctl As Control) As String Try If ctl.Parent Is Nothing Then Return ctl.Name Else Return ControlPath(ctl.Parent) & "." & ctl.Name End If Catch ex As Exception MessageBox.Show(ex.ToString) Return "" End Try End Function} *&aname(VBScriptのエラーコードメモ){VBScriptのエラーコードメモ} 2007/12/25 Descriptionが定義されていないものがある。一覧が見つけられない・・・。誰か教えて。 |エラーコード|内容|h |-2147024843|たぶんネットワークパスが見つからないとき。| *&aname(Visual Studio 2008 Express Edition){Visual Studio 2008 Express Edition} 2007/12/18 ついにきました。まあいきなりインストールするわけにもいかないから、遊ぶのは正月休みですね。不具合情報の様子見でw なんと窓の杜から落とせるよ。 http://www.forest.impress.co.jp/lib/stdy/program/progdevenv/vbexedition.html ……と思ったら違いました。ダウンロード先は「作者サイト」になってるのね。 *&aname(チェックボックスでスプリットコンテナのパネルの表示をOn/Offする){チェックボックスでスプリットコンテナのパネルの表示をOn/Offする} 2007/12/06 検索語:CheckBoxでSplitContainerのPanelをOn/Off、反転、True、False SplitContainerのパネルを片側消したかったけど、Visibleでスプリッタが動いてくれないので「なんで?」と探したらPanel1Collapsed/Panel2Collapsedというわかりにくいプロパティでした。ヘルプには「縮小または展開するかどうかを決定する値を取得または設定します。」と書いてある。表現がわかりにくいっちゅうの。 で、チェックボックスをOnにしたときに表示、Offにしたときに非表示にしたいんだけど、CheckedとCollapsedの単純バインディングだと逆になってしまうので、Bindingオブジェクトの拡張クラスをつくってみた。 #highlight(vb.net){Private Class BindingReverseBoolean Inherits Binding Public Sub New(ByVal propertyName As String, ByVal dataSource As Object, ByVal dataMember As String) MyBase.New(propertyName, dataSource, dataMember, False, Windows.Forms.DataSourceUpdateMode.OnPropertyChanged) End Sub Private Sub BindingReverseBoolean_Format(ByVal sender As Object, ByVal e As System.Windows.Forms.ConvertEventArgs) Handles Me.Format e.Value = Not e.Value End Sub Private Sub BindingReverseBoolean_Parse(ByVal sender As Object, ByVal e As System.Windows.Forms.ConvertEventArgs) Handles Me.Parse e.Value = Not e.Value End Sub End Class} で、FormのLoadでこんな感じに使います。 #highlight(vb.net){myCheckBox.DataBindings.Add(New BindingReverseBoolean("Checked", mySplitContainer, "Panel2Collapsed"))} どうもバインディングオブジェクトは [Checked]⇒True=Format=False⇒[Collapsed]⇒False=Parse=True⇒[Checked] こういう感じに動くようだ。2回値がセットされる感じ。 今回は自分で使うだけで、絶対にBoolean以外がこないのはわかっているのでエラー処理はなし。 余裕があれば汎用的なクラスにしたいので、プロパティの型チェックとかいれる予定。 *&aname(配列をリストに変換する){配列をリストに変換する} 2007/11/18 リストを配列に変換するのはToArrayで簡単。配列をリストに変換する方法がわからない・・・3時間ぐらい調べてやっと見つけた。 http://d.hatena.ne.jp/Seasons/searchdiary?word=*%5BC%23%5D わかってみれば簡単でリストのコンストラクタに渡せばよいだけでした・・・ Dim myArray As String() = {"A","B","C"} Dim myList As List(Of String) = New List(Of String)(myArray) 固定値の入ったリストを作るときもこのほうがラク。 つか、ちょっとデキる人は絶対わかってるよな。「リストを配列に変換する」で検索してどうにもひっかからないっていうのは何故。 *&aname(型比較でハマる){型比較でハマる} 2007/11/18 オブジェクトのプロパティを列挙する処理を書いていたら、PropertyTypeの型のチェックで エラー 5 型 'System.Type' の式を型 'String' にすることはできません。 のエラーが出て、いろいろ書き換えてみてもどうにも通らない。 原因は「型の比較はTypeOfだ」という思い込みでした。 #highlight(vb.net){For Each pi As PropertyInfo In target.GetType.GetProperties Select Case True Case TypeOf pi.PropertyType Is String '←ここがダメ ... Case Else ... End Select Next} ↓ #highlight(vb.net){For Each pi As PropertyInfo In target.GetType.GetProperties Select Case True Case pi.PropertyType Is GetType(System.Byte) '←これでOK ... Case Else ... End Select Next} TypeOfはオブジェクトと型を比較するのね。型どうしの直接比較ならIsだけでよい。 気づかなかったのが恥ずかしい・・・。 *&aname(NewGUIDを文字列にするときの引数){NewGUIDを文字列にするときの引数} 2007/11/10 よくわからなくなるのでメモ。xは16進数なので[0-9A-F]。 |GUID.NewGUID.ToString("N")|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|32桁| |GUID.NewGUID.ToString("D")|xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx|ハイフンで区切られた 32 桁| |GUID.NewGUID.ToString("B")|{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}|中かっこで囲まれ、ハイフンで区切られた 32 桁| |GUID.NewGUID.ToString("P")|(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)|丸かっこで囲まれ、ハイフンで区切られた 32 桁| *&aname(My.Settingsに連結したコントロール間でChangedイベントで値をやり取りすると値が書き戻されることがある){My.Settingsに連結したコントロール間でChangedイベントで値をやり取りすると値が書き戻されることがある} 2007/11/08 実際に起こったのはチェックボックスのChackedChangedでテキストボックスに値を書き込んだら、チェックボックスの値が再度My.Settingから読み出されて変更する前に戻ってしまう。 検索したらMy.Settingsの挙動不審がいくつか見つかるので、バインドしたコントロール間でやり取りはしないほうが無難。 2007/11/15 Microsoftにも正式文書がありました。 http://msdn2.microsoft.com/ja-jp/library/a65txexh(VS.80).aspx 現在、Windows フォームの一部のプロパティはバインドできません。わかりやすい例は ClientSize プロパティです。 このプロパティにバインディングすると、実行時に予期できない動作が発生します。 通常、設定をプログラムで保存して読み込むことでこの問題を解決できます。 *&aname(DataSet中の複数のテーブルをAccessのように連結して扱う){DataSet中の複数のテーブルをAccessのように連結して扱う} 2007/10/26 アクセスがクエリを元にフォームをつくれるので、同じことがVB.netでもできないかなと探していたら、DataTable間にリレーションを設定し、DataColumnのExpressionを設定することで実現できました。 #highlight(vb.net){ Private relationTest As System.Data.DataRelation Me.relationTest = New System.Data.DataRelation( _ "relationTest", New System.Data.DataColumn() {Me.tableA.ShohinCDColumn}, _ New System.Data.DataColumn() {Me.tableB.ShohinCDColumn}, _ false) Me.Relations.Add(Me.relationTest) Me.tableA.ShohinNameColumn.Expression = "Parent(rerarionTest).ShohinName" } DataGridViewの列で処理することばかり考えていて、DataTableそのものに列を追加するというのは、ちょっと思いつかなかったな。 いままでコードに対応する名称をDataGridView上で表示するのにわざわざコンボボックスを使っていたので、これでとてもラクになりました。 DataTableはアクセスのクエリの役目も果たしてくれるのですね。 ちなみにここにはコードで載せていますが、これはDataSetのDesiner.vbから拾ってきたもので、実際にはデザイナオンリー、ノンコーディングで実現できています。 *&aname(継承コントロールをデザイナで削除すると「インデックスが範囲を超えています」のエラー){継承コントロールをデザイナで削除すると「インデックスが範囲を超えています」のエラー} 2007/10/10 検索語:コンストラクタ Newの中でAddHandlerしたテキストボックスの継承コントロールで、デザイナで削除するときに インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 パラメータ名: index のエラーメッセージが出るようになってしまった。いろいろ調査した結果、原因はAddHandlerだと判明。 #highlight(vb.net){AddHandler DataBindings.CollectionChanged, AddressOf DataBindings_CollectionChanged} 最終的にはDisposeの中でRemoveHandlerを書くことで解決。 #highlight(vb.net){RemoveHandler DataBindings.CollectionChanged, AddressOf DataBindings_CollectionChanged} 似たようなことをやっている他の継承コントロールでは起きないので、解放するリソースの種類や内部処理に依存しそう。 まあ「Disposeするときにきちんとすべてのリソースを解放しましょう」というのは当たり前のことだから、いままでAddHandlerの後始末をやっていなかったのがダメなんでしょう。たぶん。 「AddHandlerしたら必ずRemoveHandlerしましょう」とか、教えてくれる人もいなかったし、どこかに書いてあるのかなぁ。 *&aname(継承したテキストボックスをフォームから削除しようとすると、エラーが出て削除されない。){継承したテキストボックスをフォームから削除しようとすると、エラーが出て削除されない。} 2007/08/27 インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。 プロジェクトを開きなおすときちんと消えている。 継承したコントロールの中でやっている処理の問題だった。詳細な内容は後でかこう。 *&aname(ComboBoxに連結したDataTableが意図せずに変更される){ComboBoxに連結したDataTableが意図せずに変更される} 2007/10/04 検索語:コンボボックス/DataTable/DataView/DataSource/Bind/データが変わる DataTableにコンボボックスを連結したときに、既存データにコンボボックスに存在しない値が入っていると、レコードのCurrent時にコンボボックスの先頭の値に書き換えられてしまう。 FormattingEnabled をTrueにすることで解消できる。FormatString を設定する必要はない。 *&aname(Express Edition ではセットアップ用のmsiはつくれない){Express Edition ではセットアップ用のmsiはつくれない} 2007/08/07 確実な情報が見つからないけど、つくれないっぽい。 ↓こういうの見つけた。んー、個人でここまで踏み込むかどうするか。会社でやる分にはVS.net使えるからなぁ。 [[WiXではじめるWindows Installer作成入門>http://codezine.jp/a/article/aid/428.aspx]] *&aname(ComboBoxにはDoubleClickイベントがないのね){ComboBoxにはDoubleClickイベントがないのね} 2007/08/24 コンボボックスでDoubleClickイベントを使おうかと思ったらありませんでした。 *&aname(CSVの読み込み){CSVの読み込み} 日本語の露出が少ないけどXmlCsvReaderというのがよさそう。テストしてみよう。 *&aname(相手先別に添付ファイルを変更するメール送信ソフトを作ってみよう){相手先別に添付ファイルを変更するメール送信ソフトを作ってみよう} 2007/07/26 VB.netでメール送信するのは簡単そう。相手のアドレスと添付ファイルのリストから、メール送信するソフトを作ってみよう。 &strike(){http://www.atmarkit.co.jp/fdotnet/dotnettips/017sendmail/sendmail.html} ↑このアドレスは2003で、2005からはクラスが変わっていました。 http://www.microsoft.com/japan/msdn/vbasic/migration/tips/netmail/ 2007/07/28 うーん、SmtpClient はいろいろ問題がありそうな。POP before SMTPとかも自作しなきゃいかんし。 http://support.microsoft.com/default.aspx/KB/927858 2007/07/28 商用利用も含めてフリーライセンスのよさそうなライブラリを発見。 [[.NET用メール送受信クラスライブラリ (TKMP.DLL)>http://uwa.potetihouse.com/library/tkmpdll.html]] ライセンスについて http://uwa.potetihouse.com/bbs/patio.cgi?mode=view&no=139 自分で組めるようにもなりたいけど、とりあえず利用させていただいて、少しづつ力をつけよう。 *&aname(コンボボックスに高速にデータをBindする){コンボボックスに高速にデータをBindする} 2007/07/24 DataSourceよりもValueMemberとDisplayMemeberを先に指定したほうが速いようです。 設定するたびにリクエリがかかる感じですね。 特に件数の多いテーブルをBindするときに効果的です。 **DataSourceを先に設定した場合 #highlight(vb.net){ DebugTimer.WriteLine("Testスタート") cboSample.DataSource = New DataView(dt) '←先に設定 DebugTimer.WriteLine("DataSourceをセット") cboSample.ValueMember = "連結したい列名" DebugTimer.WriteLine("ValueMemberをセット") cboSample.DisplayMember = "表示したい列名" DebugTimer.WriteLine("DisplayMemberをセット") } |MEMO|00:00:000|00:00:000|Testスタート| |MEMO|00:00:272|00:00:272|DataSourceをセット| |MEMO|00:00:540|00:00:268|ValueMemberをセット| |MEMO|00:00:808|00:00:268|DisplayMemberをセット| **DataSourceを後に設定した場合 #highlight(vb.net){ DebugTimer.WriteLine("Testスタート") cboSample.ValueMember = "連結したい列名" DebugTimer.WriteLine("ValueMemberをセット") cboSample.DisplayMember = "表示したい列名" DebugTimer.WriteLine("DisplayMemberをセット") cboSample.DataSource = New DataView(dt) '←後に設定 DebugTimer.WriteLine("DataSourceをセット") } |MEMO|00:00:000|00:00:000|Testスタート| |MEMO|00:00:000|00:00:000|ValueMemberをセット| |MEMO|00:00:000|00:00:000|DisplayMemberをセット| |MEMO|00:00:296|00:00:296|DataSourceをセット| *&aname(Microsoft Win32 と Microsoft .NET Framework API との対応){Microsoft Win32 と Microsoft .NET Framework API との対応} 2007/07/16 http://www.microsoft.com/japan/msdn/net/general/win32map.aspx *&aname(2005でデザイナから自動生成されるDataTableでのDBNull){2005でデザイナから自動生成されるDataTableでのDBNull} 2007/07/16 XというフィールドにDBNullが来るよねと思ってIsDBNull(X)で判定しようとしたら蹴られた。 なんで?と思ってクラスを見たら、テーブルのメソッドにIsXNullっていうのが作られてた。 なるほど。Nullの可能性のあるフィールドはこれで判断しろと。 *&aname(タイマーとメッセージボックス){タイマーとメッセージボックス} 2007/07/16 メッセージボックスが出ているあいだもタイマーは動き続けているので、処理によっては固まる。注意。 *&aname(ワークステーションのロック){ワークステーションのロック} 2007/07/16 カンタンだった。 System.Diagnostics.Process.Start("rundll32.exe", "user32.dll,LockWorkStation") 2007/07/16 ロックかけるのは簡単だけど、ロックされているかどうかの判断が難しい。つか標準ではできない。 http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200612/06120018.txt Microsoft.Win32.SystemEventsのSessionSwitchを使うことで、 ロック開始のイベントとロック終了のイベントを受け取ることができます。 との情報を発見したので、ロック状態を管理しつつ、ロックをかけてくれるクラスを作成。 → [[WorkStationLockController]] 念のためsingletonをとっておく。singletonについては → http://hccweb1.bai.ne.jp/tsune-1/VisualBasic/singleton.html ちなみにsingletonをグローバル変数的に使うのはよくないというのは心しておく。 ワークステーションのロックについて調べていたら突き当たったサイト → http://www7a.biglobe.ne.jp/~lshen/EternalWindows/ GINAとか珍しいあたりをわかりやすく書いてくれてる。 フォアグラウンドウインドウを判定するのってAPI使うしかないのかなぁ。 → http://iseebi.half-done.net/?TechDoc%2FDetectionFullscreen *&aname(LDAPとActive Directoryの要素の比較){LDAPとActive Directoryの要素の比較} 2007/07/13 参考:http://publib.boulder.ibm.com/tividd/td/ITAME/SC32-1358-00/ja_JA/HTML/am51_webseal_devref101.htm |最大長|LDAP|Active Directory| |名 (LDAP CN)|256|64| |ミドル・ネーム|128|64| |姓|128|64| |レジストリー UID (LDAP DN)|1024|2048| |ユーザー・パスワード|制限無し|256| |ユーザー記述|1024|1024| |グループ名|256|| |グループ記述|1024|1024| |シングル・サインオン・リソース名|240|256| |シングル・サインオン・リソース記述|1024|1024| |シングル・サインオン・ユーザー ID|240|256| |シングル・サインオン・パスワード|制限無し|256| |シングル・サインオン・グループ名|240|256| |シングル・サインオン・グループ記述|1024|1024| |アクション名|1|1| |アクション記述、アクション・タイプ|制限無し|制限無し| |オブジェクト名、オブジェクト・スペース名、ACL 名、POP 名|制限無し|制限無し| |オブジェクト記述、オブジェクト・スペース記述、ACL 記述、POP 記述|制限無し|制限無し| *&aname(DirectorySearcher手ごわい){DirectorySearcher手ごわい} 2007/07/13 http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-33574.htm グループとユーザーの階層をノード的に取得しようとしたけど、手ごわい。 なんだよMemberofプロパティとかPrimaryGroupが取れないとか。 Microsoftのヘルプじゃまったくダメで、LDAPの仕様とか理解しないといけないところがツラい・・・ *&aname(System.DirectoryServices.DirectoryEntry.SchemaClassNameの一覧){System.DirectoryServices.DirectoryEntry.SchemaClassNameの一覧} 2007/07/12 ※とりあえず私が使ったものをメモっていきます。 |ユーザー|User| |グループ|Group| |コンピュータ|Computer| |サービス|Service| 検索をかけても一覧が見つからない・・・誰か教えて。 *&aname(SelectCommandでデータ書き込むストアド指定するとコミットされない・・・んー){SelectCommandでデータ書き込むストアド指定するとコミットされない・・・んー} 2007/07/10 DataAdapterのSelectCommandにデータの更新ありのストアドを投げると、戻ってきた結果は正しいのにデータベースには反映されてないみたい。 んー、いちいちコミットいれなきゃダメ? →mdfファイルが毎回コピーされてしまうためでした。 http://www.atmarkit.co.jp/fdotnet/dotnettips/532dbfilecopy/dbfilecopy.html *&aname(2005のヘルプにCrystal Reportのヘルプを追加とか){2005のヘルプにCrystal Reportのヘルプを追加とか} 2007/07/09 http://salv.miscnotes.com/2005/01/tips5_vsnethelphelp.php *&aname(TreeView使ってみた){TreeView使ってみた} 2007/07/04 便利。同じTreeNodeオブジェクトを別のツリーに追加することはできなかった。 *&aname(アップキャストとダウンキャスト){アップキャストとダウンキャスト} 2007/06/14 |アップキャスト|派生クラス→基本クラス|常にOK| |ダウンキャスト|基本クラス→派生クラス|やらないほうがよい。できないこともある。| ダウンキャストについてはちょっと勉強したほうがよさそうだ。 *&aname(IIFとdecimalでハマる){IIFとdecimalでハマる} 2007/06/12 DataTable.ColumnのExpressionを使用していて、floatだったフィールドをdecimalに変更したら何故か0除算のエラー。 IIF([分母]=0,0,[分子]/[分母]) とやって0除算をしてないはずなのに・・・・・・と半日ハマる。結論は IIFは真も偽も計算してから値を返すから IIFは普段は危険だから使わないんだけど、floatのときにエラーにならなかったので見落としました。 floatは0除算でエラーを返さないのね。 でもExpressionの中ってIIFしか条件式が使えない。やむをえず [分子]/CAST([分母],'System.Double') として回避。 *&aname(GrapeCity FlexGrid for .NET 2.0J){GrapeCity FlexGrid for .NET 2.0J} ダメだこれ。もうイヤ。 何がダメって、ColumnオブジェクトのNameプロパティが連結先のDataTableの列名。 で、複数のColumnに同じNameが設定できる。だからIndex以外で列を特定する術がない。 なのに、列位置を移動するとIndexが変わる。 頼むからNameは固有値にしてMappingName を指定させてくれ。 誰だこんなコントロール使うことにしたのは。二度と使わない。 いや、最新は4.0Jだから、よくなってるのかもしれないけれど。 *&aname(VB.Netに関する資料){VB.Netに関する資料} 2007/04/22 オブジェクト倶楽部 http://www.objectclub.jp/ ここのトレーニングテキストが死ぬほど役立つ。入門用とリファレンスのちょうど中間あたりの本になりにくいあたりが解説されている。 2007/05/13 ちょっと見ようと思ったら見つけられない。C#のページにありました。 http://www.objectclub.jp/technicaldoc/c/training.pdf 2007/04/29 .NETでの正規表現の使用法 http://japan.internet.com/column/developer/20050822/28.html 2007/05/01 コンテキストメニューまわり http://vbdotnet.fc2web.com/vbnet/control/ContextMenuMenu.htm *&aname(ArrayListとList){ArrayListとList} 2007/04/22 自作クラスのコレクションを作れるに違いないと思って、ArrayListを調べて2時間。 どうしても型指定したコレクションがつくれないよー(。´Д⊂) と、泣きそうになったところでListに気がつく。 あまりにも最初にArrayListに慣れ親しんだために、それ以外思い浮かばなかった失敗。 2007/05/24 Listって.net 2005(Framework 2.0)からなので。自宅は2005、会社は2003なので、会社で使おうとして使えなくてがっかり。 *&aname(プロパティにオブジェクトを設定したときにNewのタイミング){プロパティにオブジェクトを設定したときにNewのタイミング} 2007/04/22 プロパティ用のローカル変数に Private _objectname As Objecttype と宣言していてハマる。 Private _objectname As New Objecttype きちんとインスタンス意識しないとね。 *&aname(自分自身と同じ型のコレクションをプロパティに持つ){自分自身と同じ型のコレクションをプロパティに持つ} Private _childnodes As New List(Of LogNode) Public Property ChildNodes() As List(Of LogNode) Get Return _childnodes End Get Set(ByVal value As List(Of LogNode)) _childnodes = value End Set End Property ---- 2007/04/22 とりあえず2日間ざっくり勉強して2日間ざくざく組んだら、少し勘が働いてきた。 言語って、あるレベルまでいかないと、目の前が開けないよね。一回開けてくると調査スピードも速くなる。 *&aname(DateTimeメモ){DateTimeメモ} 2007/04/27 DateTimeの中身は#1/1/0 00:00:00#(西暦0年1月1日)からの経過ミリ秒 javascriptと値がずれるなと思ったら、javascriptは#1970/01/01 00:00:00#からの経過ミリ秒でした。 で、それでも誤差が32400ミリ秒出るので何かと思ったら、32400/60/60=9、ということで標準時との差。 *&aname(再帰型のクラスでちょっとはまったこと){再帰型のクラスでちょっとはまったこと} クラスを通過するたびにカウントアップするような引数は参照渡しすること。 *&aname(ライブラリメモ){ライブラリメモ} |ファイルパスの分解|System.Io.Path|ディレクトリ名はディレクトリを指定すればFileNameで取得できる| ||.GetExtension|戻り値はピリオド付き| |ファイルの検索|System.Io.Directory|戻り値はString()| |ファイル情報|My.Computer.FileSystem.GetFileInfo|| ||.Length|ファイルサイズの単位はバイト| |正規表現|System.Text.RegularExpressions|Regex.Match(Path.GetFileNameWithoutExtension(file), "^\d{1,5}$").ToString| |後方参照で置換||.Replace(対象文字列,"<a href="http://~">(.*?)</a>","$1")| |ファイル名に使えない文字を置換||mystring=Regex.Replace(mystring, "[\\\/:,;*?""<>&#124;]", "_")| |文字コード|System.Text.Encoding.GetEncoding("SHIFT-JIS")|| *&aname(LinkLabel){LinkLabel} なんかハイパーリンクを使いたかったのでざくっと調べたらLinkLabelっていうコントロールがある。 テキストいれればクリックで勝手にブラウザ呼んでくれるのかと思ったら、呼び出しも書かなきゃいけないし、訪問済みかどうかも自分で設定しなきゃいけないみたい。不便。自分で変更できるのはありがたいとして、最初からブラウザと同期してくれてもいいと思うんだけど、なんでだろう。 まあ複数リンクも扱えるけど、もっとこう、さくっと。 *&aname(ハッシュテーブル){ハッシュテーブル} 2007/05/16 Addは使わなくても良い。 >指定したキーがハッシュテーブルに存在しない場合には、新しい要素として登録される。 >キーがすでに存在する場合には、インデクサではそのキーに対応する値が置き換えられるが、Addメソッドでは例外が発生する。 *&aname(With Nothingを使って変数を局所化){With Nothingを使って変数を局所化} 2007/05/16 http://blogs.wankuma.com/jeanne/archive/2006/11/07/43926.aspx Sub Hoge With Nothing dim i as integer 処理 End With With Nothing dim i as integer 処理 End With End Sub みたいな形で変数のスコープを短くして使いまわせるという話。 *&aname(共有メンバ){共有メンバ} 2007/05/17 ヘルプより >既定では、クラスのデータはクラスの各インスタンスに固有になります。ただし、1 つのクラスから作成したすべてのオブジェクト間で、1 つのデータ項目を共有する方が都合のよい場合もあります。このような場合には、Shared 修飾子を使用して、変数の同じ値をクラス内のすべてのインスタンスで共有できるようにします (共有メンバは、他のプログラミング言語では "静的メンバ" と呼ばれる場合もあります)。共有メソッドは、事前にクラスのインスタンスを作成しなくても、クラス名を使用して直接呼び出すことができます 参考:http://blogs.wankuma.com/torikobito/archive/2007/04/04/70121.aspx *&aname(よくつかうリンク){よくつかうリンク} 2007/05/29 [[Visual Studio User Group>http://vsug.jp/]] ---- *comment このページの記述で聞きたいこととか間違ってることとかありましたらコメントを。 #comment_num2 ----

表示オプション

横に並べて表示:
変化行の前後のみ表示: