2008年12月24日水曜日

.NET RadioButton CheckedChangedイベントを処理する

ラジオボタンやチェックボックスでCheckedChangedイベントを処理する場合、
Private Sub RadioButton_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged

If Me.RadioButton1.Checked Then
Console.WriteLine("ラジオボタン1がチェックOn時の処理です。")
ElseIf Me.RadioButton2.Checked Then
Console.WriteLine("ラジオボタン2がチェックOn時の処理です。")
End If

End Sub 

このようなコードだと
ラジオボタン2をチェックONすると
まずラジオボタン2がチェックOnになったのでCheckedChangedイベントが走り、「ラジオボタン2がチェックOn時の処理です。」が出力されます。
そしてラジオボタン1がチェックOffになったのでCheckedChangedイベントが走り、再度「ラジオボタン2がチェックOn時の処理です。」が出力されます。




以下のコードのようにすれば処理が2回実行されることはないですね。
Private Sub RadioButton_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged
If DirectCast(sender, RadioButton).Checked Then
If Me.RadioButton1.Checked Then
Console.WriteLine("ラジオボタン1がチェックOn時の処理です。")
ElseIf RadioButton2.Checked Then
Console.WriteLine("ラジオボタン2がチェックOn時の処理です。")
End If
End If
End Sub  

Private Sub RadioButton_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles RadioButton1.CheckedChanged, RadioButton2.CheckedChanged

If Sender.Equals(Me.RadioButton1) AndAlso Me.RadioButton1.Checked Then
Console.WriteLine("ラジオボタン1がチェックOn時の処理です。")
ElseIf Sender.Equals(Me.RadioButton2) AndAlso RadioButton2.Checked Then
Console.WriteLine("ラジオボタン2がチェックOn時の処理です。")
End If

End Sub

.NET Option Infer ステートメント

Option Infer ステートメント
変数の宣言に対するローカル型の推論の使用を有効にします。
VS2008で新たに追加されたオプションです。

Option Infe On
変数の宣言に対するローカル型の推論の使用を有効にします。

Option Infer Off
変数の宣言に対するローカル型の推論の使用を無効にします。

デフォルトはOnです。


Option Infer Onでは以下のようにAs句を書かなくてもコンパイルエラーになりません。
Public Shared Sub Main()

Dim str = "123"
str.Substring(0, str.Length)

Dim lst = New List(Of Integer)
lst.Add(1)

End Sub


またOption Strict Offでも上記のコードはコンパイルエラーになりません。
Option Strict OffではAs句を省略できるためです。

では何が違うかというと
Option Strict Off (Option Infer Off)では変数strも変数lstもObject型になります。
また「str.」と入力してもインテリセンスにはObject型のメンバしか表示されません。
strのSubstringメソッドや、lstのAddメソッドは遅延バインディングにより、実行時に変数の中身がチェックされ、メソッドが存在すれば実行されます。

これに対し
Option Infer On (Option Strict On)では、変数strはコンパイル時にString型と推論されます。変数lstはList(Of Integer)型と推論されます。
Option Infer Onでは、変数宣言の右辺の初期化式からコンパイラが変数の型を推論して決定されるので、「str.」と入力すればインテリセンスにはString型のメンバが表示されます。
右辺の初期化式を書かないとコンパイルエラーになります。


Option Strict Off、Option Infer Onでは
右辺の初期化式があれば型推論が行われstr変数はString型になります。
Public Shared Sub Main()
Dim str = "123"
str.Substring(0, str.Length)
End Sub

右辺の初期化式ががなければ型推論が行わずstr変数はObject型になります。
Option Strict Offなのでコンパイルエラーにはなりません。
Public Shared Sub Main()
Dim str 
str = "123"
str.Substring(0, str.Length)
End Sub

2008年12月23日火曜日

.NET Option Strict ステートメント

Option Strict ステートメント

Option Strict On
  • 変数の宣言でAs句を省略できません。
  • 遅延バインディングは禁止されます。
  • 明示的なキャスト演算子を使用しない縮小変換は禁止されます。



Option Strict Off
  • 変数の宣言でAs句を省略できす。
  • 遅延バインディングを使用できます。
  • 明示的なキャスト演算子を使用しない縮小変換が使用できます。




デフォルトはOption Strict Off です。
Microsoftのホームページに
「Option Strict On によって 厳密な型指定が可能になり、データの損失を伴う意図しない型変換を回避でき、
遅延バインディングが禁止されて、パフォーマンスが改善されるので、必ず使用することをお勧めします。」
とあります。

必ず使用することをお勧めします
Σ(゚д゚;) ヌオォ!? デフォルトでOption Strict Onにしたらいいじゃないの!?


Option StrictをデフォルトでOnにするには


「ツール」→「オプション」→「プロジェクトおよびソリューション」→「VisualBasicの規定値」で
Option Strictのデフォルト値をOnに設定できます。



変数の宣言でAs句を省略


Option Strict Offでは変数の宣言でAs句での型指定を省略することができ変数はObject型になります。
Option Strinct Onではコンパイルエラーとなります。
Public Shared Sub Main()
Dim a
a = 123

a = 123.4567

a = "123"
End Sub




遅延バインディング


遅延バインディングとは、Object型の変数にインスタンを代入し、そのインスタンスのメソッドなどを呼び出すことです。
Option Strict Offでは下記のコードは正常に実行されます。Option Strict Onではコンパイルエラーとなります。
Public Shared Sub Main()
Dim obj As Object
obj = New System.Windows.Forms.Form
obj.Text = "CreateForm"
Console.WriteLine(obj.Text)
End Sub

このコードではObject型の変数にフォームのインスタンスを代入しそのTextプロパティを参照しています。
コンパイル時は変数objがTextプロパティを利用可能か判断できないので、エラーにならず、
実行時に変数objに代入されているインスタンスをチェックし、Textプロパティが存在するか判断します。

これに対し、インスタンスが特定の型として宣言された変数に代入される場合を事前バインディングといいます。
Option Strict Onでは遅延バインディングは禁止され、事前バイディングを使用することになります。
Public Shared Sub Main()
Dim frm As System.Windows.Forms.Form
frm = New System.Windows.Forms.Form
frm.Text = "CreateForm"
Console.WriteLine(frm.Text)
End Sub




明示的なキャスト演算子を使用しない縮小変換


精度の小さな型を精度の大きな型に変換することを拡大変換といいます。
値型の拡大変換
Public Shared Sub Main()
Dim int As Integer
Dim lng As Long
frm.Text = "CreateForm"
Console.WriteLine(frm.Text)
End Sub


参照型の拡大変換
子クラスは親クラスのすべてのメンバをもっているため、拡大変換をおこなっても何も問題が発生しません。
Public Shared Sub Main()
Dim frm As System.Windows.Forms.Form
frm = New System.Windows.Forms.Form
frm.Text = "CreateForm"
Console.WriteLine(frm.Text)
End Sub


拡大変換は、実行時には常に正常に行われ、データ消失が発生することはありません。
Option Strict OnでもOffでも、拡大変換は暗黙的に実行できます。

拡大変換に対し精度の大きな型を精度の小さな型に変換することを縮小変換といいます。
縮小変換は正常に行われるとは限りません。

たとえばOption Strict Offで以下のコードをを実行すると、
Long型の値がInteger型の範囲に収まらないため、OverflowExceptionが発生します。
Public Shared Sub Main()
Dim lng As Long = 12345678901
Dim int As Integer
int = lng
End Sub


またOption Strict Offで以下のコードを実行すると、
Double型の値の小数点以下部分が欠落します。
Public Shared Sub Main()
Dim dbl As Double = 123.45
Dim int As Integer
int = dbl
End Sub


Option Strict Onでは上記のコードはコンパイルエラーととなります。
縮小変換を行う場合、明示的にキャスト演算子を使用しなければなりません。
Public Shared Sub Main()
Dim lng As Long = 123
Dim int As Integer
int = Cint(lng)
End Sub

.NET Option Explicit ステートメント

Option Explicit ステートメント
ファイル内のすべての変数を明示的に宣言するよう強制します。


Option Explicit On
すべての変数を明示的に宣言する必要があります。
宣言されていない変数名を使用すると、コンパイル時にエラーが発生します。

Option Explicit Off
宣言されていない変数を使用できます。
宣言されていない変数はすべて Object 型になります。

デフォルトはOnです。

以下のコードはOption Explicit Offでは正常に実行され「a:1」が出力されます。
変数aは宣言されていませんが、暗黙的にObject型の変数になります。
またOption Explicit Onではコンパイルエラーになります。
Public Sub ExplicitTest()
a = 1
Console.WriteLine("a:{0}", a)
End Sub

.NET Option Compare ステートメント

特に意識することなくデフォルトのBinaryにしています。
改めて「Option Compareって何ですか?」と聞かれて即答できませんでした・・・。


Option Compare ステートメント
文字列のデータを比較するときに使用する、文字列の比較方法を指定します。

Option Compare Binary
文字コード番号順で文字列が比較されます。

Option Compare Text
システムロケール(言語や国に固有の情報)で決められたテキストの並べ替え順序に基づいて、文字列が比較されます。

デフォルトはBinaryです。


以下のコードをBinaryとTextでそれぞれ実行してみます。
文字コードは「A」は65、「B」は66、「a」は97です。
Public Sub ComparTest()
Console.WriteLine("B > a:{0}", "B" > "a")
Console.WriteLine("A = a:{0}", "A" = "a")
End Sub



Option Compare Binaryでの実行結果は
B > a:False
A = a:False
となります。


Option Compare Textでの実行結果は
B > a:True
A = a:True
となります。

2008年12月18日木曜日

Bloggerに目次を表示させるには

以下のサイトを参考にしてブログに目次をつけてみました。
clmemo@aka :@ Blogger に目次を設置する

これはたいへん便利です。

まずHTMLの編集でテンプレートを表示します。
このとき「ウィジットのテンプレートを展開」にチェックをつけること。
あとはリンク先の通りですが、Contents Includableのコードにコメントを入れるとエラーになりました。

BloggerでSyntaxHighliterを使うには?

この記事は以前に投稿したのですが、なぜか消えてしまいましたので再投稿です。

FaziBear Blogger Syntax Highlighter にアクセスします。

「To add it check out this page」をクリックします。


「Add To Blogger」をクリックします。


「ウィジットを追加」をクリックします。


以上で設定は終了です。


使い方は表示させたいコードをPreタグで囲みます。赤字部分は言語により変更します。
<pre name="code" class="java">

(コード)

</pre>




サポートしている言語は以下の通りです。

  • c

  • c++

  • c#

  • css

  • delphi

  • html

  • java

  • js

  • pascal

  • php

  • python

  • ruby

  • sql

  • vb

  • xml




2008年12月17日水曜日

.NET DataTableをグループ化し集計するには

DataTableから重複を除くには

DataTableの集約計算を行う(Compute)
を利用して、DataTableをグループ化し集計を行います。

以下のようなデータが入ったDataTableから、Field1とField2で重複を取り除き集計をおこないます。

Field1Field2Field3
りんご青森100
りんご青森100
みかん愛媛100
みかん和歌山100
みかん和歌山100
メロン北海道100

重複を取り除いて集計した結果は以下のデータになります。
Field1Field2Expr
りんご青森200
みかん愛媛100
みかん和歌山200
メロン北海道100


    Dim dtOriginal As New DataTable
dtOriginal.Columns.Add("Field1", GetType(String))
dtOriginal.Columns.Add("Field2", GetType(String))
dtOriginal.Columns.Add("Field3", GetType(Integer))

dtOriginal.Rows.Add(New Object() {"りんご", "青森", 100})
dtOriginal.Rows.Add(New Object() {"りんご", "青森", 100})
dtOriginal.Rows.Add(New Object() {"みかん", "愛媛", 100})
dtOriginal.Rows.Add(New Object() {"みかん", "和歌山", 100})
dtOriginal.Rows.Add(New Object() {"みかん", "和歌山", 100})
dtOriginal.Rows.Add(New Object() {"メロン", "北海道", 100})

Dim viw As New DataView(dtOriginal)
Dim isDistinct As Boolean = True
Dim cols() As String = {"Field1", "Field2"}
Dim dtFilter As DataTable = viw.ToTable(isDistinct, cols)
dtFilter.Columns.Add("Expr", GetType(Integer))
For Each row As DataRow In dtFilter.Rows
    Dim expr As String = String.Format("Field1 = '{0}' AND Field2 = '{1}'", row("Field1"), row("Field2"))
    row("Expr") = dtOriginal.Compute("SUM(Field3)", expr)
Next


For Each row As DataRow In dtFilter.Rows
    Console.WriteLine("Field1={0}, Field2={1}, Expr={2}", row.Item("Field1").ToString, row.Item("Field2").ToString, row.Item("Expr").ToString)
Next

.NET DataTableから重複を取り除くには

以下のようなデータが入ったDataTableから、Field1とField2で重複を取り除きます。
Field1Field2
りんご青森
りんご青森
みかん愛媛
みかん和歌山
みかん和歌山
メロン北海道


重複を取り除いた結果は以下のデータになります。
Field1Field2
りんご青森
みかん愛媛
みかん和歌山
メロン北海道


Dim dtOriginal As New DataTable
dtOriginal.Columns.Add("Field1", GetType(String))
dtOriginal.Columns.Add("Field2", GetType(String))
dtOriginal.Rows.Add(New Object() {"りんご", "青森"})
dtOriginal.Rows.Add(New Object() {"りんご", "青森"})
dtOriginal.Rows.Add(New Object() {"みかん", "愛媛"})
dtOriginal.Rows.Add(New Object() {"みかん", "和歌山"})
dtOriginal.Rows.Add(New Object() {"みかん", "和歌山"})
dtOriginal.Rows.Add(New Object() {"メロン", "北海道"})

Dim viw As New DataView(dtOriginal)
Dim isDistinct As Boolean = True
Dim cols() As String = {"Field1", "Field2"}
Dim dtFilter As DataTable = viw.ToTable(isDistinct, cols)

For Each row As DataRow In dtFilter.Rows
Console.WriteLine("Field1={0}, Field2={1}", row.Item("Field1").ToString, row.Item("Field2").ToString)
Next


【関連項目】
DataTableをグループ化し集計するには

2008年12月11日木曜日

GrapeCityTool MultiRow5.0J 数値型ユーザ定義セルを改造してハマった

以前に数値型セルを作成しました。
MultiRow 5.0J ユーザ定義セル
この数値セルは最小値~最大値の範囲外の値が入力または設定されると
セルクラスのOnCellFormattingメソッドでNothingを設定するようにしていました。

今回は、最小値~最大値の範囲外の値が「設定」された場合はNothingを設定し
範囲外の値が「入力」されたときは、入力前の値を表示するよう変更しようとしたのですが
大いにハマりました。

入力前の値はセルクラスのInitializeEditingControlメソッドの引数formattedValueでセルクラスのインスタンス変数に退避したのですが、
セルクラスのOnCellFormattingメソッドでこの退避した値を参照すると常にNothingが返ります。

結論
退避したインスタンス変数をCloneメソッドで作成したオブジェクトに設定しなければならない。


MultiRow5.0J…もう嫌だ。

GrapeCityTool MultiRow5.0J セルの値が変更された場合のみCellValidatingイベントを発生させるには

標準ではセルの移動を行っただけでCellValidatingイベントが発生します。
ユーザによりセルの値が変更された場合のみ、CellValidatingイベントを発生させるようにします。

CellValidatingイベント内で変更後の値は e.FormattedValueで取得できます。
問題は変更前の値の取得方法です。
GetValueメソッドで取得すればいいのですが
下記の1では変更後の値が返ります。2では変更前の値が返ります。

1.以下の操作で発生するイベント
Enterキーで編集状態にする
セルに入力
Enterキーで編集状態を終了する
Tabキーでセル移動

CellEnter
CellBeginEdit
CellEditingControlShowing
CellParsing
CellValueChanged ※セルの値が変更された場合のみ発生する。
CellEndEdit
CellLeave
CellValidating
CellValidated

2.以下の操作で発生するイベント
マウスダブルクリックで編集状態にする
セルに入力
マウスクリックでセル移動
CellEnter
CellBeginEdit
CellEditingControlShowing
CellLeave
CellValidating
CellParsing
CellValueChanged ※セルの値が変更された場合のみ発生する。
CellValidated
CellEndEdit



CellValidatingイベント内でGetValueメソッドで取得する値はあてにならないので
CellEnterイベントでインスタンス変数に変更前の値を退避しておき、
CellValidatingで退避した変更前の値と変更後の値を比較し、ユーザによる変更があったかどうかを判定します。

Public Class CustomMultiRowSheet
Inherits GrapeCity.Win.MultiRow.GcMultiRow

Private _OriginalValue As Object

Protected Overrides Sub OnCellEnter(ByVal e As GrapeCity.Win.MultiRow.CellEventArgs)
'変更前の値を記憶します。
Me._OriginalValue = Me.GetValue(e.RowIndex, e.CellIndex)
MyBase.OnCellEnter(e)
End Sub

Protected Overrides Sub OnCellValidating(ByVal e As GrapeCity.Win.MultiRow.CellValidatingEventArgs)
'OnCellEnterイベントで記憶した値と比較します。
Dim isCellModified As Boolean
Dim currentValue As Object = e.FormattedValue
If Me._originalValue Is Nothing Xor currentValue Is Nothing Then
isCellModified = True
ElseIf Me._originalValue IsNot Nothing And currentValue IsNot Nothing Then
If Me._originalValue.ToString <> currentValue.ToString Then
isCellModified = True
End If
End If

If isCellModified Then
MyBase.OnCellValidating(e)
End If
End Sub

End Class

GrapeCityTool MultiRow5.0J ユーザによるセルの変更を判定するには

Ver4.0にはユーザによるセルの変更を判定するModifiedプロパティがありましたが
Ver5.0にはありません。

実現するにはCellValueChanged イベント を監視し、IsCurrentCellDirtyで変更がコミットされた場合にフラグを立てます。
CellValueChangedイベントはユーザによりセルの値が変更された場合に発生します。
Public ClassCustomMultiRowSheet
Inherits GrapeCity.Win.MultiRow.GcMultiRow

Private _IsModified As Boolean

Public ReadOnly Property Modified() As Boolean
Get
Return Me._IsModified
End Get
End Property

Protected Overrides Sub OnCellValueChanged(ByVal e As GrapeCity.Win.MultiRow.CellEventArgs)
If Me.IsCurrentCellDirty Then
Me._IsModified = True
End If
MyBase.OnCellValueChanged(e)
End Sub

End Class



しかし、ユーザー定義セルでOnCellFormattingメソッドで書式設定などを行うとCellValueChangedイベントが発生するため、
上記の方法ではユーザによるセルの値の変更を判定できません。
そのため、OnCellEnterメソッドで変更前の値を記憶しておき、OnCellEndEditで変更後の値と比較すると
ユーザによるセルの変更を判定できます。
Public ClassCustomMultiRowSheet
Inherits GrapeCity.Win.MultiRow.GcMultiRow

Private _OriginalValue As Object
Private _IsModified As Boolean

Public ReadOnly Property Modified() As Boolean
Get
Return Me._IsModified
End Get
End Property

Protected Overrides Sub OnCellEnter(ByVal e As GrapeCity.Win.MultiRow.CellEventArgs)
'変更前の値を記憶します。
Me._OriginalValue = Me.GetValue(e.RowIndex, e.CellIndex)
MyBase.OnCellEnter(e)
End Sub

Protected Overrides Sub OnCellEndEdit(ByVal e As GrapeCity.Win.MultiRow.CellEndEditEventArgs)
'OnCellEnterイベントで記憶した値と比較し、セルの値が変更されていれば
'ユーザがセルの値を変更したかどうかのフラグを立てます。
'すでにフラグがたっている場合は比較を行いません。
If Me._isModified = False Then
Dim currentValue As Object = Me.GetValue(e.RowIndex, e.CellIndex)
If Me._originalValue Is Nothing Xor currentValue Is Nothing Then
Me._isModified = True
ElseIf Me._originalValue IsNot Nothing And currentValue IsNot Nothing Then
If Me._originalValue.ToString <> currentValue.ToString Then
Me._isModified = True
End If
End If
End If

MyBase.OnCellEndEdit(e)

End Sub

End Class

2008年12月10日水曜日

GrapeCityTool MultiRow5.0J ユーザ定義セル

MultiRow5.0j 数値型セルぐらいは用意して欲しかったなぁ
それともInputManが抱き合わせで売れるようにワザと用意しないのかい?

InputManを買うお金もないので、数値型セルを自分で作りました。


数値型セルの要件


・マイナス値は赤字で表示。
・入力は数値のみ。貼り付けも数値のみ。
・最小値と最大値の範囲でのみ入力可。
・編集状態が終了したタイミングで3桁ごとにカンマ区切りにする。
・小数点以下桁数の設定。


準備


・ユーザー定義セルをツールボックスに登録するには、MultiRow for Windows Forms 5.0J Service Pack 1 (5.0.2008.0930)が必要です。
Sp1を適用していない場合は適用します。

・ヘルプの以下の箇所を読みましょう。
[製品の概要]
-[Service Pack 1 の変更点]
-[デザイナのツールボックスのカスタマイズ]
-[ユーザー定義セル]
-[デザイナのツールボックスに登録する]



ユーザ定義セルを作成するクラスライブラリの作成


以下に記述したカスタム編集エディタクラスとカスタムセルクラスは、クラスライブラリとして作成しますので
まずは新規プロジェクトでクラスライブラリを作成します。


数値型編集エディタクラスの作成


エディタクラスはカスタムコントロールの作成要領とほとんど同じです。
数値型編集エディタはGrapecity.Win.MultiRow.TextBoxEditingControlを継承して作りました。
「数値型セルの要件」で必要なプロパティなどを実装します。
KeyPressなどで数字以外の文字を弾く処理を記述します。
ペーストで数字以外を貼り付けできないよう処理を記述します。


数値型セルクラスの作成


数値型編集エディタクラスを編集エディタにもつ、数値型セルクラスです。

・Grapecity.Win.MultiRow.TextBoxCellを継承します。

・EditTypeプロパティで数値型編集エディタクラスのTypeオブジェクトを返します。
Public Overrides ReadOnly Property EditType() As System.Type
Get
Return GetType(CustomNemericTextBoxEditingControl)
End Get
End Property


・数値型編集エディタクラスに作成したカスタムプロパティは、数値型セルにも同じプロパティを用意します。

・セルのCloneメソッドでカスタムプロパティの値を複製します。
よくある質問:ID11562より
実行時に GcMultiRow コントロールに追加されるセルは、GcMultiRow.Template.Row.Cells プロパティのセルのインスタンスのクローンとなります。
このため、ユーザー定義型セルを作成してカスタムプロパティを実装している場合、Clone メソッドでプロパティの値を複製する必要があります。
Public Overrides Function Clone() As Object
Dim cell As CustomNumericTextBoxCell 
cell = DirectCast(MyBase.Clone, CustomNumericTextBoxCell )
cell.CustomProperty1 = Me._CustomProperty1 
Return cell
End Function


・InitializeEditingControlメソッドでエディタに設定する値やプロパティを設定します。
InitializeEditingControlメソッドはセルが編集状態になる場合に発生します。
このメソッドの引数ByVal formattedValue As Objectがエディタの値になります。
この値はセルに表示されている書式変換後の値なので、この値よりカンマ区切りなどの書式を除去したり、エディタに表示する値を加工したりします。
またここでセルに設定されているカスタムプロパティの値を、エディタの同プロパティに設定します。

・OnCellFormattingメソッドでセルに表示する値の書式を設定します。
OnCellFormattingメソッドは表示用の文字列に変換される際に発生します。
このメソッドの引数ByVal e As GrapeCity.Win.MultiRow.CellFormattingEventArgsのValueプロパティの値が、セルに表示される値になります。
この値に対して、カンマ区切りなどの書式設定やマイナス値の前景色の設定を行います。


数値型セルをツールボックスに登録する


・数値型セルを含むdllを「マイ ドキュメント\GrapeCity MultiRow\MultiRow 5.0 CellTypes」に配置します。
Windows Vista/2008 の場合、
C:\Users\<ユーザー名>\Documents\GrapeCity MultiRow\MultiRow 5.0 CellTypes
Windows 2000/XP/2003 の場合、
C:\Documents and Settings\<ユーザー名>\My Documents\GrapeCity MultiRow\MultiRow 5.0 CellTypes

・Visual Studio でプロジェクトに「MultiRow 5.0 テンプレート」を追加するか、または既存のテンプレートを開いてデザイナを表示する。
デザイナのツールボックスを右クリックし、「ユーザー定義セルを再読み込み」を実行する。
ツールボックスの「ユーザー定義セル」グループにユーザー定義セルが表示されます。


ユーザ定義セルのdll参照


ツールボックスに表示されたユーザ定義セルをドラッグ&ドロップでテンプレートを作成しビルドすると、
bin/debuまたはbin/releaseにユーザ定期セルdllがコピーされます。
もしdllに変更があったら、プロジェクトのbin配下のdllを手動で変更しなければなりません。
それは面倒なので、参照設定でユーザ定義セルdllの参照先を変更しておくことをお勧めします。


以上 間違っていたらご指摘ください。


MultiRow5.0Jの調査はまだまだ山積みです。
使用感としてはVer4.0より確実に面倒が増えたと感じます。
慣れとかではなく、あきらかにコード量が増えました。
Ver4.0はカスタムセルの作成など複雑なことはできなかったけれど、その分簡単でした。
Ver5.0では複雑なことができるようになったけれど、簡単だったことまでが複雑になった感じがします。

ですがその前に…
VerUpするなら互換性をキープしてほしい!!
まじで勘弁して欲しい。
あとヘルプ。
ユーザ定義セルをサポートしてるんだからInitializeEditingControlメソッドとかちゃんとヘルプに載せて下さい。

余談ですが
GcMultiRowクラス、その他編集エディタを使用するセルはすべてラップクラスを用意することをお勧めします。
出たばっかりですからね。やっぱ色々と細かい問題があります。

2008年12月5日金曜日

GrapeCityTool MultiRow5.0J 注意点

Enabled=Falseに設定するときの注意点


Enabled=Falseに設定しても、そのセルは選択できる。
セルを選択できないようにしたい場合は、Enabledプロパティ設定時にSelectableプロパティも設定する。


ボタンセルをEnabled=Falseに設定するときの注意点


Enabled=FalseかつSelectable=Falseにしているボタンセルで、セルをクリックすると
CellContentClickが発生する!Σ( ̄ロ ̄lll)
CellContentClickではそのセルのEnabledをチェックしてからボタンのクリック処理を記述すること。

.NET フォームを閉じるときにValidatingイベントを走らせないようにするには

Validatingイベントは
フォームの×ボタンをクリックしフォームを閉じようとしたり、
CausesValidatin=Falseを設定しているコんトロールであっても、
そのコントロールの処理内でMe.Closeを記載していたりすると、
Validatingイベントが走ってしまいます。

フォームを閉じるときにValidatingイベントを走らせないようにするには
Public Class Form1
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Const WM_CLOSE As Integer = &H10
Const WM_SYSCOMMAND As Integer = &H112
Const SC_CLOSE As Integer = &HF060

Select Case m.Msg
Case WM_SYSCOMMAND
If m.WParam.ToInt32() = SC_CLOSE Then
'Xボタン、コントロールメニューの「閉じる」、
'コントロールボックスのダブルクリック、
'Atl+F4などにより閉じられようとしている
'このときValidatingイベントを発生させない。
Me.AutoValidate = Windows.Forms.AutoValidate.Disable

End If
Case WM_CLOSE
'Application.Exit以外で閉じられようとしている
'このときValidatingイベントを発生させない。
Me.AutoValidate = Windows.Forms.AutoValidate.Disable
End Select

MyBase.WndProc(m)
End Sub
End Class

GrapeCityTool MultiRow5.0J 基本

セルに値を設定するには


Dim iCurRow As Integer = Me.GcMultiRowSheet.CurrentRow.Index
Dim value As Object = "XXX"
Me.GcMultiRowSheet.SetValue(iCurRow,"textBoxCell1", value )
※Itemプロパティを使用して値を設定するとパフォーマンスが悪い。
Me.GcMultiRowSheet.Item(iCurRow,"textBoxCell1").Value = value

セルの値を取得するには


Dim iCurRow As Integer = Me.GcMultiRowSheet.CurrentRow.Index
Dim value As Object = Me.GcMultiRowSheet.GetValue(iCurRow,"textBoxCell1")
※Itemプロパティを使用して値を設定するとパフォーマンスが悪い。
Dim value As Object = Me.GcMultiRowSheet.Item(iCurRow,"textBoxCell1").Value


ボタンセルの背景色を変更するには


ボタンセルのFlatStyleをSystem以外に設定する。
注意
FlatStyleをSystem以外に設定した場合、SelectionBackColor(選択色)をTransparentに設定しないと
ボタンセルにフォーカスした際に背景色が選択色(デフォルト紺)になってしまいます。


セルのイベント発生順序


1.以下の操作で発生するイベント
Enterキーで編集状態にする
セルに入力
Enterキーで編集状態を終了する
Tabキーでセル移動

CellEnter
CellBeginEdit
CellEditingControlShowing
CellParsing
CellValueChanged ※セルの値が変更された場合のみ発生する。
CellEndEdit
CellLeave
CellValidating
CellValidated

2.以下の操作で発生するイベント
マウスダブルクリックで編集状態にする
セルに入力
マウスクリックでセル移動
CellEnter
CellBeginEdit
CellEditingControlShowing
CellLeave
CellValidating
CellParsing
CellValueChanged ※セルの値が変更された場合のみ発生する。
CellValidated
CellEndEdit

CellValueChanged以降のイベントでセルの入力値をGetValueで取得できます。


セルの値を検証するには


CellValidatingイベントを使用します。
入力値はe.FormattedValueを使用します。
※上記のイベント発生順序の2番ではGetValueメソッドを使用して入力値を取得できません。
入力値が異常でセルを移動させたくない場合はe.CancelプロパティにTrueを設定します。
注意
WindowsControlのValidating同様にフォームの×ボタンやMe.CloseでCellValidatingイベントが発生します。
フォームを閉じるときにValidatingイベントを走らせないようにするにはなどの対策が必要です。