Google
 
Web itpro-blogger.blogspot.com
金曜日, 9月 26, 2008

[VB2005]Load後のイベント処理(初期表示処理)

▼質問
初期表示で特定のコントロールにフォーカスをしたいんだ。

そこで、Loadイベントの最後でFocusイベントを入れたんだが、うまくいかないんだ。

どうやったらできるか教えてくれ!

▼回答
フォームのイベントには、Loadイベントの後に実行されるイベントがあるんだ。

それは、フォームが初めて表示されるたびに発生するイベントなんだ。

だから、初期表示に1回だけ実行したい処理は、そこに入れればいいんだ。

そのイベントとは、Shownイベントだ。

■参考サイト
Form メンバ (System.Windows.Forms)
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.form_members(VS.80).aspx


月曜日, 9月 15, 2008

[VB2005]DataGridの行の高さを固定にする

▼質問
DataGridの高さを固定にしたいんだ。どうやったらできるか教えてくれ!

▼回答
DataGridの高さを制御するには、Layoutイベントで高さを制御すればできるんだ。

行を追加する後に、現在値の高さをPreferredRowHeightプロパティに設定する。

LayoutイベントでSetRowHeight関数を呼んでやることで制御できる。

PreferredRowHeightプロパティに現在値(前回値)を設定する。

If (Me.DataGrid1.VisibleRowCount > 0) Then
Me.DataGrid1.PreferredRowHeight = _
GetRowHeight(i, Me.DataGrid1.PreferredRowHeight, Me.DataGrid1)
End If

行の高さを取得・設定する関数

Private Sub SetRowHeight()
'全行数分ループする
For i As Integer = 0 To Me.DataGrid1.VisibleRowCount - 1
If (Me.DataGrid1.PreferredRowHeight <> _
GetRowHeight(i, Me.DataGrid1.PreferredRowHeight, Me.DataGrid1)) Then
SetRowHeight(i, Me.DataGrid1.PreferredRowHeight, Me.DataGrid1)
End If
Next i
End Sub

Public Function GetRowHeight(ByVal Row As Integer, ByVal height As Integer, ByVal oDG As DataGrid) As Integer
Dim p As Reflection.PropertyInfo = _
GetType(DataGrid).GetProperty("DataGridRows", _
Reflection.BindingFlags.FlattenHierarchy Or _
Reflection.BindingFlags.IgnoreCase Or _
Reflection.BindingFlags.Instance Or _
Reflection.BindingFlags.NonPublic Or _
Reflection.BindingFlags.Public Or _
Reflection.BindingFlags.Instance Or _
Reflection.BindingFlags.Static)

Dim obj As Object = _
CType(p.GetValue(oDG, _
Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Static Or _
Reflection.BindingFlags.GetProperty Or Reflection.BindingFlags.Public Or _
Reflection.BindingFlags.SuppressChangeType, _
Nothing, Nothing, Nothing), Object)

If (Row < propertyinfo =" _" object =" _" type =" _" height =" height">



■参考サイト
VBレスキュー(花ちゃん)のVB.NET・VB2005用掲示板
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=7871&reno=7851&oya=7850&mode=msgview&page=0
DataGridの行の高さを文字列にあわせて設定する: DOBON.NETプログラミング掲示板過去ログ
http://dobon.net/vb/bbs/log3-27/15680.html


日曜日, 9月 14, 2008

[VB2005]DataGridの幅を固定にする(操作不可)

▼質問

DataGridのヘッダを表示すると列の幅が変更できるんだ。これを、固定表示にしたいんだ。

どうやったらできるか教えてくれ!

▼回答

DataGridには、列の幅を固定にするプロパティはないんだ。だから固定にはできないんだ。

だけど、カスタムコントロールを作成して列の幅の変更操作をできないようにすればできるよ。

その方法の一部を下記に示しておくから参考にしてくれ!

DataGridTextBoxColumnの参考例

Public MyWidth As Integer = 0
Public MyWidthFlag As Boolean = False

'''
''' コントロールの幅を取得または設定します。
'''

''' コントロールの幅。
Public Property CustomWidth() As Integer
Get
Return MyWidth
End Get
Set(ByVal value As Integer)
Me.MyWidth = value
End Set
End Property

'''
''' コントロールの幅を固定にできるかの有無を示す値を取得または設定します。
''' 幅を固定にできる場合は true。それ以外の場合は false。既定値は false です。
'''

''' コントロールの幅を固定にできるかの有無。
Public Property CustomWidthFlag() As Boolean
Get
Return MyWidthFlag
End Get
Set(ByVal value As Boolean)
Me.MyWidthFlag = value
End Set
End Property

Private Sub DataGridCustomTextBoxColumn_WidthChanged( _
ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.WidthChanged
Dim obj As DataGridCustomTextBoxColumn = _
CType(sender, DataGridCustomTextBoxColumn)
If (obj.MyWidthFlag) Then obj.Width = obj.MyWidth
End Sub


■参考サイト

DataGridの列の幅をユーザーが変更できないようにする: .NET Tips: C#, VB.NET, Visual Studio

http://dobon.net/vb/dotnet/datagrid/lockcolumnwidth.html



土曜日, 9月 13, 2008

[VB2005]DataGridBoolColumnのチェックボックスを制御する

▼質問
DataGridにチェックボックを表示するためにDataGridBoolColumnを使ってチェックボックスを

作成したんだけど、プログラムからチェックボックスのチェックを表示・非表示するやり方が

わからないんだ。どうやったらできるか教えてくれ!

▼回答
MouseClickイベントに下記のコードを記述すればできるから参考にしてくれ!!


Dim dg As DataGrid = CType(sender, DataGrid)
Dim row As Integer = dg.CurrentCell.RowNumber : Dim col As Integer = dg.CurrentCell.ColumnNumber
If (dg.TableStyles.Item(0).GridColumnStyles(col).GetType.Name = "DataGridBoolColumn") Then
Dim BoolColumn As DataGridBoolColumn = _
CType(dg.TableStyles.Item(0).GridColumnStyles(col), DataGridBoolColumn)
Dim Bind As BindingManagerBase = _
Me.BindingContext(DirectCast(dg.DataSource, DataTable))
Dim value As Boolean = False
Dim drv As DataRowView = _
CType(DirectCast(Bind.Current, DataRowView), DataRowView)
Dim value As Boolean = _
CBool(IIf(CType(BoolColumn.PropertyDescriptor.GetValue(drv), Boolean), _
False, True))
BoolColumn.PropertyDescriptor.SetValue(drv, value)
End If
BoolColumn.DataGridTableStyle.SelectionBackColor = SystemColors.Window


■参考サイト
VB コントロールのデータ連結
http://homepage1.nifty.com/rucio/main/VBdotNet/Database/Database6.htm


金曜日, 9月 12, 2008

[VB2005]DataGridを編集可能で新規追加行(*行)を非表示にする

▼質問

DataGridを編集可能にすると新規追加行(*行)が表示されるんだ。

これを表示しないようにする方法はないのか教えてくれ!

▼回答

あるよ!下記のサイトを参考にしてくれ!

■参考サイト

DataGridの一番下の新しい行(*行)が表示されないようにする: .NET Tips: C#, VB.NET, Visual Studio

http://dobon.net/vb/dotnet/datagrid/allownew.html

おーすばらしい!!できた。

関数にしてみた。


Public Sub SetAllowNew(ByVal b As Boolean, ByVal oDG As DataGrid)
Dim objCurrencyManager As CurrencyManager = _
CType(oDG.BindingContext(oDG.DataSource, oDG.DataMember), CurrencyManager)
'DataViewを取得する
Dim objDataView As DataView = CType(objCurrencyManager.List, DataView)
'新しい行の追加を設定する
objDataView.AllowNew = b
End Sub
 
▼質問
「CurrencyManager」って何?
 
▼回答

オブジェクトのプロパティ値とコントロールのプロパティ値との間の単純バインディングの

リストを管理するオブジェクトらしい。

▼質問

新規追加行は表示されずに編集は可能になったんだけど・・・。

これだと、全てのセルが編集可能になってしまって困るんだ。

特定のセルだけを編集可能にするにはどうしたらいいの?

▼回答

DataGridのCurrentCellChangedイベント、MouseClickイベント、MouseDownイベント、

MouseUpイベントでカレントセルをチェックするればできるよ。

こんな関数を作成してみたから、参考にしてくれ!

各イベントで呼ぶだけでOKだ!!



Private Sub CheckCurrentCell(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs)
Dim dg As DataGrid = CType(sender, DataGrid)
Dim row As Integer = dg.CurrentCell.RowNumber
Dim col As Integer = dg.CurrentCell.ColumnNumber
Select Case dg.CurrentCell.ColumnNumber
Case 対象列番号
Case Else
End Select
End Sub



月曜日, 9月 01, 2008

[VB2005]SystemColorsからBrushの変換

▼質問
SystemColorsで使っている色をBrushクラスに変換したいんだ。どうしたらできるんだい。

▼回答
SolidBrushクラスを使用してやればできるよ。下記を参考にしてくれ!

Dim b As Brush = New SolidBrush(SystemColors.ActiveCaption)


This page is powered by Blogger. Isn't yours?