指定されたバイト数になるよう文字列をパディングする
共通処理にパディング演算するメソッドを作る。
以下の条件を指定できるようにしたい
- 文字を寄せる方向(右寄せor左寄せ)
- パディングするバイト数
- 埋め込み文字
パディングといえば
String.PadRight メソッド とかString.PadLeft メソッド だけど、
これは指定された文字数になるまで埋め込み文字を追加するので、
2バイト文字を含む文字列だと、バイト数がオーバーした文字列が生成されてしまう。
そこでこんな感じ。
''' <summary> ''' パディング ''' </summary> ''' <param name="targetData">対象文字列</param> ''' <param name="yose">寄せ("右"|"左")</param> ''' <param name="keta">桁(バイト数)</param> ''' <param name="moji">埋め込み文字</param> ''' <returns>演算結果データ</returns> Public Shared Function Padding(ByRef targetData As String, ByRef yose As String, ByRef keta As Integer, ByRef moji As String) As String If targetData Is Nothing Then targetData = "" End If Dim value As String = String.Empty 'パディングする文字数を演算 '(文字数 = 桁 - (対象文字列のバイト数 - 対象文字列の文字列数)) Dim padLength As Integer = keta - (System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(targetData) - targetData.Length) If yose.Equals("右") Then '右寄せでパディング value = targetData.PadLeft(padLength, moji.ToCharArray()(0)) ElseIf yose.Equals("左") Then '左寄せでパディング value = targetData.PadRight(padLength, moji.ToCharArray()(0)) End If Return value End Function
参考:
WinMergeの比較結果を出力する
WinMergeで比較した結果を出力する方法
方法1.レポートを生成する
1. メニューバーの[ツール(T)]\[レポートの生成(R)]を選択
2. 保存先とファイル名を指定するとHTMLファイルが出力される
方法2.印刷する
1. メニューバーの[ファイル(F)]\[印刷(P)]を選択
2. プリンタを選択して印刷する
※プリンタにCubePDFやXPS Document Writeを選択すればPDFやXPS形式のファイルに出力できる
参考:
追記(2016/11/18)
WinMergeの出力書式について考察した記事があったので追記。
たしかにHTMLで出力しても書式としていまいちだなーと思ってた。
差分の色がちゃんと着いてるのはわかりやすいけど。
Cygwinとかは私もちょっとよくわかんないので試してないけど
それよりコメントの方が気になる。
今更ですが、WinMergeで出力されたhtmlファイルをExcelで開くと、それっぽく貼り付けられた形になりますよ。お試しあれ。
へぇー。
やってみる。
この比較結果をHTML形式でレポート出力して
こんな感じになって、
このファイルを
Excelで開くと、
こうなる。
いい感じ。かと思いきや、
Excelで開くと、行単位での差分しかわからない。
(HTMLなら2行目の3文字めは薄い黄色で出てた)
まぁ、1行分を1セルに出力してるから文字単位で背景色変えるのは無理だわな。
参考:
キーボードを日本語配列に変更する(Windows7)
SQL Server にエクセルデータをインポートする
エクセルデータでテストデータを作成し、
SQL Server Management Studioでインポートする方法。
特にデータソースの選択をした後
「次へ」ボタン押下でエラーポップアップが出た。
(SQL Server Management Studioがインストールされてるのは
テスト用に用意した環境で、そっちにはOfficeがインストールされてないせい??)
参考URLに記載の通り、「AccessDatabaseEngine.exe」をダウンロードすることで解決。
ExceptionからSQL Server の一意制約違反を検知する
システム用のExceptionクラス(hogeException)がありまして。
共通処理はExceptionすべてhogeException型にして投げてくる。
クエリを実行する共通処理があって、
Exceptionの中でも一意制約エラーが発生した場合を検知したい。
これでいけたらいいんだけど・・・。
Private Function InsertRecord(ByVal dataRecordInfo() As String, ByVal insertColumnIchi As Dictionary(Of String, Integer)) As Integer Dim effectCount As Integer = 0 '影響を受けた行数 Dim sql As String = "INSERT INTO [TMP_TABLE] ([CODE],[VALUE]) VALUES (@Code ,@Value)" Try effectCount = Me.CommonLogic.ExecDBQuery(sql, paramNames, paramValues, paramTypes, -1) Catch hogeEx As hogeException If Not IsNothing(hogeEx.InnerException) Then Dim ex As Exception = GetInnerException(hogeEx.InnerException) If TypeOf ex Is SqlException Then If CType(ex, SqlException).Number = 2627 Then 'レコード登録時に、一意制約エラーが発生した場合 Console.WriteLine("一意制約エラー発生") Exit Try End If End If End If Throw New hogeException("エラーID", hogeEx) End Try Return effectCount End Function Private Function GetInnerException(ex As Exception) As Exception If IsNothing(ex.InnerException) Then Return ex End If Return GetInnerException(ex.InnerException) End Function
- 参考
フォーム内のすべてのボタンを非活性にする
ボタンの2重押下防止としてボタンをすべて非活性にしてみたかった件。
全部のボタンコントロールを1個1個コード書くのは大変なので、
コントロールをすべて取得する。
''' <summary> ''' 使用可能コントロール(ボタン)切替処理 ''' </summary> ''' <param name="hParent">切り替え対象コントロール</param> ''' <param name="enable">活性化:True、非活性化:False</param> Public Shared Sub ChangeButtonEnabled(ByVal hParent As Control, ByVal enable As Boolean) ' hParent 内のすべてのコントロールを取得する For Each cControl As Control In hParent.Controls ' 列挙したコントロールにコントロールが含まれている場合は再帰呼び出しする If cControl.HasChildren Then ChangeButtonEnabled(cControl, enable) End If ' コントロールの型が Button の場合、Enabledプロパティを切り替える If TypeOf cControl Is Button Then cControl.Enabled = enable End If Next cControl End Sub
これでボタンを非活性にすることはできたが、
非活性にしてても、その間に非活性されているボタンを押下すると
あとからボタン押下イベントが発生する。。。
ボタンの2重押下防止の方法はいろいろ試したけど
どうにも意図した通りに動かないので
BackgroundWorkerで時間のかかる処理を実行させることにした。
別スレッドでやるなら、ボタンを非活性じゃなくて
フォーム毎非活性にすることにしたよ。
Delegate Sub CallbackChangeEnabled(ByVal enable As Boolean) ''' <summary> ''' 使用可能コントロール切替処理 ''' </summary> ''' <remarks></remarks> Private Sub ChangeEnabled(ByVal enable As Boolean) If Me.InvokeRequired Then Dim d As New CallbackChangeEnabled(AddressOf ChangeEnabled) Me.Invoke(d) Else Me.Enabled = enable End If End Sub
参考:
DataGridViewの行ヘッダに行番号を表示する
DataGridViewの行ヘッダを表示するようにし、
- 項目名の文字列を表示する一覧
- 行番号を表示する一覧
をそれぞれ作った。
詳細記載する時間がないので、とりあえず参考にしたリンクのみメモ。
参考: