設定ファイルとしての型付データセット

開発現場で利用するコーディングの手間を軽減したり、

調査を軽減したりするツールを作る事がたまにある。

固定長ファイルのリーダ・ライタだったり、

エクセルファイル出力クラスだったり。

例えば、固定長ファイルの場合は、

項目の開始位置や桁数、変換形式(EBCDECだったりZoneだったりPackだったり)、

レコードタイプや、その認識方法等、様々な設定をする必要がある。

.NET以前だとiniファイルや独自の設定ファイルが必要で、

その設定ファイル用のリーダ・ライタも自分で用意してあげなくてはいけなかった。

だが、.NETになってからは型付データセットというものが登場した。

型付データセットを利用する事で、その設定ファイル用のリーダ・ライタクラスも、

データセットを継承した型付データセット専用クラスという形で作成され、

それを自分で作成する必要がないため、そこの部分に気を使う必要がなくなった。

また、VisualStudioで型付データセットを見ると、

その設定ファイルの構成を視覚的に見る事ができるので、

設定ファイルの構成を変更する時も、間違いを起こす可能性が少ない。

(一度決めたら頻繁に変更する類のモノではないが)

そんな理由で、私は型付データセットをDBを利用した部分以外にも結構利用している。

Share

C#における私のif文の書き方(二つの値を比較する場合)

C,C++,C#とif文で二つの値を比較する時に、イコールを表す時は==と等号を二つ並べる必要がある。

過去に、いろんな言語を行き来しているとうっかり、等号を一つにしてしまう事があった。

そこで、ここ数年は不等号ベースでif文を書くようにしている。

つまり、

if(valueA == valueB)

{

//valueAとvalueBが等しいとき。

}

else

{

//valueAとvalueBが等しくないとき。

}

ではなく

if(valueA != valueB)

{

//valueAとvalueBが等しくないとき。

}

else

{

//valueAとvalueBが等しいとき。

}

としていると言う事。

もし valueAとvalueBが等しくない時はメソッドを抜けてしまっていい場合

if(valueA != valueB)

{

//valueAとvalueBが等しくないとき。

return;

}

//valueAとvalueBが等しいとき。

とします。

もし、valueAとvalueBが等しい時はメソッドを抜けてしまっていい場合は例外で

if(valueA == valueB)

{

//valueAとvalueBが等しいとき。

return;

}

//valueAとvalueBが等しくないとき。

とします。

基本的に、ある条件の時にそれ以下の処理を行わなくていい場合は、

そこで終わらせてしまいたいので、例外的にそうします。

これだけで、ケアレスミスによる不具合はへります。

また、生存期間を最短にする事で、不具合が出たときに該当する範囲を狭くする事ができます。

Share

DataGrid内のラジオボタンでグループに出来ない問題の回避方法

表題の通りですが、

RadioButtonコントロールを継承して、以下のコードを書くと

グループ化できるし、ポストバック時にCheckedプロパティも

正常に動作します。

001 <DefaultProperty("Checked"), ToolboxData("<{0}:RadioButtonEx runat=server></{0}:RadioButtonEx>")> _
002 Public Class RadioButtonEx
003     Inherits System.Web.UI.WebControls.RadioButton
004 
005     Public Overrides ReadOnly Property UniqueID() As String
006         Get
007             If Me.GroupName Is Nothing OrElse Me.GroupName.Length = 0 Then
008                 Return MyBase.UniqueID
009             Else
010                 Return Me.GroupName()
011             End If
012         End Get
013     End Property
014 
015     Protected Overrides Sub OnPreRender(ByVal e As System.EventArgs)
016         Me.Attributes.Add("value", MyBase.UniqueID)
017         MyBase.OnPreRender(e)
018     End Sub
019 
020     Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
021         MyBase.OnInit(e)
022         Me.Checked = MyBase.UniqueID = Me.Page.Request.Form.Item(Me.GroupName)
023     End Sub
024 End Class
025 

Share

参照型にrefキーワードがついている時とついていない時の違い

メソッドを定義するときに、refキーワードを参照型に付けたときと付けなかったときの違いは、簡単に言えば・・・

・ref付きは参照する場所を変更出来る。

・ref無しは参照する場所を変更出来ない。

・両方とも、参照先のオブジェクトが持った値を変更する事は可能。

である。

例をあげれば・・・

001         private void button1_Click(object sender, System.EventArgs e)
002         {
003             testClass a = new testClass();
004             a.VAL = "test";
005             test(ref a);
006             //"testdayo2"が表示される。
007             MessageBox.Show(a.VAL);
008             test2(a);
009             //"testdaro"が表示される。
010             MessageBox.Show(a.VAL);
011         }
012 
013         //変数そのものが渡される。
014         private void test(ref testClass val)
015         {
016             //変数の中にあるプロパティの変更は反映される。
017             val.VAL = "testdayo";
018             //参照の変更も反映される。
019             val = new testClass();
020             val.VAL = "testdayo2";
021         }
022         //変数のコピーが渡される。
023         private void test2(testClass val)
024         {
025             //変数のこぴーであっても、参照先は同じなので
026             //変数の中にあるプロパティの変更は反映される。
027             val.VAL = "testdaro";
028             //参照の変更は関数内でのみ反映される。
029             //なぜなら変数のコピーでしかないから。
030             val = new testClass();
031             val.VAL = "testdakedo";
032         }
033     }
034 
035     public class testClass
036     {
037         private string _val;
038         public string VAL
039         {
040             get
041             {
042                 return _val;
043             }
044             set
045             {
046                 _val =value;
047             }
048         }
049     }
050 

という事である。

動作を何かに例えるならば、

ref付き引数のメソッドをAさんとすると・・・

・Aさんに住所録渡したら、住所録に書いてあった住所の家に落書きされていた。

また、住所録を返して貰ったら住所録の中身が変わっていた。

ref無し引数のメソッドをBさんとすると・・・

・Bさんにアドレス帳の内容をコピーして渡したら、住所録に書いてあった住所の家に落書きされていた。

といった感じである。

Share

続・CSSクラスの動的切り替え

昨日書いたCSSクラスをonFocusとonBlurで切り替えたいと思っていた件が解決した。

というか、僕が馬鹿だった。

普通に

obj.className=”クラス名”

で切り替えられた。

これで、全部CSSに出来るなぁ・・・。

ASP.NET用拡張テキストボックスも実装を変更しよう・・・。

Share

CSSクラスの動的切り替え

onFocusとかonBlurとかイベント発生時にCSSの各要素を変更することが可能なことは知っているのだが、ならばいっそクラス名指定で切り替えさせて欲しいなんて思う。

いろいろと調べたり試したりしてるけれど、いまいち、できるのかできないのかもわからない。

もしできるな装飾関係の情報はすべて外部CSSファイルに纏められるのになぁ。

ちなみに、軽いVS.NET Tipsを一つ。

外部CSSファイルをドラッグして、aspxのデザイナ上でドロップすると、その外部CSSファイルを参照するタグが追加される。

今まで、知らずにHTMLデザイナで手書きしてたよ・・・。

Share

コントロールコレクションから指定したコントロールのみ取得したい

コントロールコレクションから指定したコントロールのみ取得したい時、通常FindControlを使用するが、型指定で取得したい時は下記のようにしています。

VB.NETで記述してあります。

001 '[WebForms]
002     Public Shared Function GetControl(ByVal Parent As Control, ByVal Type As System.Type, Optional ByVal Name As String = "") As Control
003         Dim objControl As Control
004 
005         If Name.Length() > 0 Then
006             Return Parent.FindControl(Name)
007         End If
008 
009         For Each objControl In Parent.Controls
010             If objControl.GetType() Is Type  Then
011                 Return objControl
012             End If
013             If objControl.Controls.Count > 0 Then
014                 Dim tmpControl As Control
015                 tmpControl = GetControl(objControl, Type, Name)
016                 If Not tmpControl Is Nothing Then
017                     Return tmpControl
018                 End If
019             End If
020         Next
021         Return Nothing
022     End Function
023 
024 '[WindowsForms]
025 
026     Public Shared Function GetControl(ByVal Parent As Control, ByVal Type As System.Type, Optional ByVal Name As String = "") As Control
027         Dim objControl As Control
028 
029 
030         For Each objControl In Parent.Controls
031             If Name.Trim.Length = 0 OrElse Name = objControl.Name Then
032                 If objControl.GetType() Is Type Then
033                     Return objControl
034                 End If
035             End If
036 
037             If objControl.Controls.Count > 0 Then
038                 Dim tmpControl As Control
039                 tmpControl = GetControl(objControl, Type, Name)
040                 If Not tmpControl Is Nothing Then
041                     Return tmpControl
042                 End If
043             End If
044         Next
045         Return Nothing
046     End Function
047 

Share

コントロールコレクションから特定タイプのコントロール群を再帰的に抽出する。

コントロールが所有するコレクションから指定した型のコントロール群を取得するロジックです。

Parentにコントロール群を所有するコントロールを渡し,typeに取得したいコントロールの型情報を渡します。

戻り値は、取得した結果でObject配列になっています。

ちなみに、VB.NETで記述してあります。

001     Public Shared Function GetControls(ByVal Parent As Control, ByVal type As System.Type) As Object()
002         Dim objControl As Control
003         Dim tmpControl As Control
004         Dim objList As New Collections.Stack
005         Dim objControls() As Object
006 
007         '検索
008         For Each objControl In Parent.Controls
009             '現在の要素が指定の型であれば、スタックに登録
010             If objControl.GetType() Is type Then
011                 objList.Push(objControl)
012             End If
013             '現在の要素が子を持っていたら再帰呼び出し
014             If objControl.Controls.Count > 0 Then
015                 objControls = GetControls(objControl, type)
016                 '再帰呼び出しした結果コントロールリストを持っていればスタックに登録
017                 If Not objControls Is Nothing Then
018                     For Each tmpControl In objControls
019                         objList.Push(tmpControl)
020                     Next
021                     objControls = Nothing
022                 End If
023             End If
024         Next
025         '返す
026         objControls = objList.ToArray()
027         Return objControls
028     End Function
029 

Share