月曜日, 12月 29, 2008
[VB2005]Excel処理の高速化
大量のデータをデータベースから読込んでExcelのシートに表示したいんだ。
ループしてValueにデータを格納すると遅くなるんだ。
一括してデータを格納する方法はないのか?!
▼回答
一括してデータを貼り付ける方法はあるよ。
まず、セルの行と列を2次元にしたデータ領域を作成するんだ。
Dim value(5, 2) As String
この領域にデータを格納して、次の様にRangeに貼り付ける範囲を指定して
Range("A1:B5").Value = value
Valueに2次元配列を格納すれば、配列に格納したイメージのままセルに
データが貼り付けられるんだ。
金曜日, 12月 26, 2008
[VB2005]ExcelのA1形式で列名取得
Excelの参照形式で表示されるA1形式の数字以外の列名を取得したいんだ。
どうしたらできるか教えてくれ!
▼回答
サンプルを示すから参考にしてくれ!!
Public Shared Sub GetExcelA1Address(ByRef strA1() As String)
Dim xlApp As Excel.Application = Nothing
Try
xlApp = CreateObject("Excel.Application")
If IsNothing(xlApp) Then Exit Sub
xlApp.Workbooks.Add()
xlApp.WindowState = Excel.XlWindowState.xlMinimized
xlApp.Visible = False
xlApp.DisplayAlerts = False
xlApp.ScreenUpdating = False
Dim wWorksheet As Excel.Worksheet = _
CType(xlApp.ActiveWorkbook.ActiveSheet, Excel.Worksheet)
ReDim strA1(256)
'最大列数分ループする。
For i As Integer = 1 To 256
strA1(i) = Replace(Split(CType(wWorksheet.Columns(i), _
Excel.Range).Address(False, True, Excel.XlReferenceStyle.xlA1), _
":")(0), "$", "")
Next i
GC.Collect()
Catch ex As Exception
Finally
If (Not IsNothing(xlApp)) Then xlApp.Quit()
xlApp = Nothing
GC.Collect()
End Try
End Sub
火曜日, 12月 16, 2008
[VBA]CopyFromRecordsetでAccessのメモ型が読込めない
CopyFromRecordsetでAccessのメモ型が読込めない!
どうしてなのか教えてくれ!
▼回答
まずは、データベースのオープンの仕方を調べてみてくれ!
下記のようになっていなか調べてみてくれ!
con.Open ("Driver={Microsoft Access Driver (*.mdb)}; DBQ=C:\db1.mdb")
ここで問題なのは、Driver=の部分なんだ。
これはODBC接続でデータベースに行っていることを示している。
このODBC接続に不具合があるようなんだ。
だから、これをOLDB接続に替えればうまくいくと思うよ。
その方法を書きに示しておくから参考にしてくれ!
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db1.mdb;"
■参考サイト
[XL2000]DAO3.6でCopyFromRecordsetを使用するとデータが欠ける
http://support.microsoft.com/kb/414048/ja
ADOの接続文字列に設定するPROVIDERとDRIVERの記述方法の違い --Access Club 超初心者 FORUM--
http://www.accessclub.jp/bbs3/0222/superbeg70904.html
土曜日, 12月 13, 2008
[VB2005]2つのDataGridのスクロールを連動させる
2つのDataGridのスクロールを連動させるにはどうしたら良いんだ。
DataGridのScrollイベントでスクロールのValue値を設定したんだがうまくいかないんだ。
Private Sub DataGrid2_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid2.Scroll
Dim obj As DataGrid = CType(sender, DataGrid)
CType(Me.DataGrid1.Controls.Item(0), HScrollBar).Value = CType(obj.Controls.Item(0), HScrollBar).Value
End Sub
スクロールだけ動いて、グリッドの内部が動かないんだ。
Refresh等のイベントを呼んでも駄目だったんだ。
どうしたらよいか教えてくれ!
▼回答
DataGridを継承した独自のクラスを作成するしか方法はないようだ。
独自クラスでスクロールを行うパブリックメソッドを作成して
引数にValue値を与えてそのメソッドの中でGridHScrolled
メソッドをコールすればいいんだ。
Public Class CustomDataGrid
Inherits DataGrid
'''
''' 水平スクロールバーのスクロールイベントを呼び出しNewValueを設定します。
'''
''' スクロールバーの新しい値
Public Sub GridHScroll(ByVal newValue As Integer)
Dim args As New ScrollEventArgs(ScrollEventType.LargeIncrement, newValue)
GridHScrolled(Me, args)
End Sub
End Class
■参考サイト
DataGrid内の指定された行までスクロールする: .NET Tips: C#, VB.NET, Visual Studio
http://dobon.net/vb/dotnet/datagrid/gridvscrolled.html
▼質問
片方に垂直スクロールがあると少しずれるんだ。
どうしたらよいか教えてくれ!
▼回答
垂直スクロールを表示させてから、それを非表示にすればいいんだ。
Visibleは設定ができないようだから、次の例のようにWidthを0に設定すればいいんだが・・・。
CType(Me.DataGrid1.Controls.Item(1), VScrollBar).Width = 0
これだけでは駄目なんだ。
もうひとつ、連動する相手側のサイズをあらかじめスクロールの幅分だけ短くしてないとうまく
いかないから気をつけてくれ!
金曜日, 12月 05, 2008
[VBA]DAO or ADO の Close
DAOやADOのデータベース接続で失敗した時に作成しようとしたDatabaseやRecordsetの
クローズがされているかチェックしてクローズしたいんだ。
どうやったらできるか教えてくれ!
▼回答
下記にそのサンプルを示しておくから参考にしてくれ!!
Dim db As Database
Dim rs As Recordset
If (Not rs Is Nothing) Then rs.Close
If (Not db Is Nothing) Then db.Close
[VBA]DAOからADOへの移植
DAO から ADO への移植 1
http://www.microsoft.com/japan/msdn/data/techmat/ado/dao2ado.aspx
Takenoff Labs >> LotusScriptからRDBのデータをやりとりする
http://takenoff.com/notes/lotusscript/20081125002012.html
accessのVBAの記述についていくつか質問です。 - 教えて!goo
http://oshiete1.goo.ne.jp/qa432565.html
水曜日, 12月 03, 2008
[VBA]QueryTable
QueryTableって何?
どうやって使うの?
▼回答
ODBCのデータソースを使って簡単にデータベースにアクセスできる関数なんだ。
サンプルを示しておくから参考にしてくれ!
If (Worksheets(シート名).QueryTables.Count <= 0) Then
With Worksheets(シート名).QueryTables.Add( _
Connection:="ODBC;DSN=データソース;UID=ユーザ;PWD=パスワード", _
Destination:=Worksheets(シート名).Range("A1"))
.Sql = Array("SELECT * FROM " & tableName)
.Refresh BackgroundQuery:=False
End With
else
Selection.QueryTable.Sql = Array("SELECT * FROM " & tableName)
Selection.QueryTable.Refresh BackgroundQuery:=False
End If
■参考サイト
[XL97]外部データベースにアクセスする方法
http://support.microsoft.com/kb/408061/ja
▼質問
QueryTableを使って簡単にデータベースにデータを登録したいんだ。
どうやってできるか教えてくれ!
▼回答
サンプルを示しておくから参考にしてくれ!
maxRow = Worksheets(シート名).Range("A65536").End(xlUp).row
maxCol = Worksheets(シート名).Rows(1).End(xlToRight).Column
desCol = maxCol + 1
For Each objQuery In Worksheets(シート名).QueryTables
objQuery.Delete
Next
With Worksheets(シート名).QueryTables.Add( _
Connection:="ODBC;DSN=データソース名;UID=ユーザー;PWD=パスワード", _
Destination:=Worksheets(シート名).Cells(1, desCol))
.Sql = "DELETE FROM テーブル名 WHERE 条件)
.Refresh
Do While .Refreshing
DoEvents
Loop
.Parent.Names(.Name).Delete
.Delete
End With
Worksheets(シート名).Cells(1, desCol).ClearContents
For i = 2 To maxRow
strValue = ""
For j = 1 To maxCol
If (strValue <> "") Then strValue = strValue & ", "
strValue = strValue & "'" & Worksheets(シート名).Cells(i, j).Value & "'"
Next j
With Worksheets(シート名).QueryTables.Add( _
Connection:="ODBC;DSN=データソース名;UID=ユーザー;PWD=パスワード", _
Destination:=Worksheets(シート名).Cells(1, desCol))
.Sql = "INSERT INTO テーブル名 VALUES(" & strValue & ")"
.Refresh
Do While .Refreshing
DoEvents
Loop
.Parent.Names(.Name).Delete
.Delete
End With
Worksheets(シート名).Cells(1, desCol).ClearContents
Next i
■参考サイト
■QueryTables.Add/.Deleteと.Names().Delete - 半角チルダ
http://blog.goo.ne.jp/end-u/e/2fd0b68b8cb29e4b80dc7182a800fc9c
▼質問
Refreshで次のエラーが出るんだ。
「バックグラウンドでデータが更新中であるため、この操作は行えません。」
どうやったら回避できるか教えてくれ!
▼回答
それは、SQLの処理が終わる前に実行しているSQLの処理を止めるような
処理が実行されているからなんだ。
だから、SQLの実行が終了したのを確認してから次の処理を実行しなくてはいけないんだ。
そのサンプルを次に示しておくから参考にしてくれ!
Refreshの後に次のコードを書けばいいんだ。
Do While .Refreshing
DoEvents
Loop
金曜日, 11月 28, 2008
[VB2005]SaveFileDialog
SaveFileDialogコンポーネントを使ってCSVファイルを保存しているんだけど
ディレクトリを変更して保存するとアプリケーションがフリーズするんだ。
どうしてか教えてくれ!
▼回答
SaveFileDialogコンポーネントを使ってディレクトリを操作するとSaveFileDialogコンポーネントの
InitialDirectoryが変わってしまうことが原因だと思うよ。
だから、次の様にInitialDirectoryのバックアップをしてから最後にまた戻せばいいんだ。
Dim bakDir As String = SaveFileDialog1.InitialDirectory
SaveFileDialog1.InitialDirectory = bakDir
日曜日, 11月 23, 2008
[SQL]記号文字列操作
次の文字列を挿入・更新をSQL文でする方法がわからないから教えてくれ!
!"#$%&()=~{`+*}_?><\'
▼回答
挿入・更新はシングルクウォーテーションを2つ並べてSQL文を作ればいいんだ。
▼質問 次のSQL文を実行するとうまくカウントされないんだ。
SELECT COUNT(*) FROM テーブル名 WHERE フィールド = '!"#$%&()=~{`+*}_?><\'''
どうしたらできるか教えてくれ!
▼回答
LIKE文を使えばできるよ。
SELECT COUNT(*) FROM テーブル名 WHERE フィールド LIKE '!"#$%&()=~{`+*}_?><\%'
日曜日, 11月 09, 2008
[VB2005]EXCELの幅設定・折り返し設定
EXCELの幅を設定したり、折り返し設定をしたいんだ。
どうやったらできるか教えてくれ!
▼回答
次を参考にしてくれ!
Dim xlApp As Object = CreateObject("Excel.Application")
Dim wWorksheet As Excel.Worksheet = CType(xlApp.ActiveWorkbook.ActiveSheet, Excel.Worksheet)
CType(wWorksheet.Cells(1, 1), Excel.Range).ColumnWidth = 10
CType(wWorksheet.Cells(1, 1), Excel.Range).WrapText = True
wWorksheet.Cells(1, 1) = "あいうえおかきくけこ"
木曜日, 10月 30, 2008
[EXCEL]ADO関連
ADO(Microsoft Active X データ オブジェクト)の基本的な使い方を教えて欲しいんだ。
▼回答
基本的な使い方のサンプルを次に示しておくから参考にしてくれ!!
①参照設定あり
Microsoft ActiveX Data Objects 2.X Library
[変数宣言]
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
[オブジェクト生成]
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
②参照設定なし
[変数宣言]
Dim cn As Object
Dim rs As Object
[オブジェクト生成]
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
③Fieldsプロパティ
[書式]
recordset.Fields.Item(0)
recordset.Fields.Item("name")
recordset.Fields(0)
recordset.Fields("name")
recordset(0)
recordset("name")
recordset![name]
④上書きサンプル
strSQL = "SELECT COUNT(*) FROM " & strTBL & " WHERE フィールド名= 値"
Set rs = cn.Execute(strSQL)
count = rs.Fields(0)
rs.Close
If (count = 1) Then
'更新
strSQL = "SELECT * FROM " & strTBL & " WHERE フィールド名= 値"
rs.Open strSQL, cn, adOpenForwardOnly, adLockOptimistic 'SQL文を実行
rs!フィールド名= 値
rs.Update '更新(保存)
rs.Close
Else
'新規作成
strSQL = "SELECT * FROM " & strTBL
rs.Open strSQL, cn, adOpenKeyset, adLockOptimistic 'テーブルを開く
rs.AddNew '新規レコードを追加する
rs!フィールド名= 値
rs.Update '更新(保存)
rs.Close
End If
■参考サイト
VB ADO 操作
http://www.red.oit-net.jp/tatsuya/vb/ADO.htm
アクセスVBA講座_ADO_Recordsetオブジェクトの作成
http://www.geocities.jp/cbc_vbnet/ADO/recordset.html
火曜日, 10月 21, 2008
[VB2005]OpenOfficeをエクセル(Excel)のように使用する
VBでOpenOfficeのCalcをエクセル(Excel)のように操作したいんだ。
どうやったらできるかサンプルが欲しいんだ。
何か良い情報があったら教えてくれ!
▼回答
良さそうなサンプルがあったから試してみてくれ!
でも、サンプルはCalcじゃなくてWriterだけど・・・。
これで、雰囲気は掴めるかな?!
Calcのサンプルを作成してみたので参考にしてみてくれ!!
Sub HelloWorldExampleCalc()
Dim myCalc As Object, mySheet As Object, myCell As Object
myCalc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, dummyArray)
mySheet = myCalc.getCurrentController().getActiveSheet()
myCell = mySheet.getCellByPosition(0, 1)
myCell.String = OOoMess111
myCell = mySheet.getCellByPosition(0, 2)
myCell.Value = 100
myCell.CharColor = OOoRGB(0, 200, 0)
myCell = mySheet.getCellByPosition(0, 3)
myCell.Formula = "=A3*2"
myCell.CharWeight = OOOawtFontWeightBOLD
mySheet.getCellByPosition(0, 4).CellBackColor() = OOoRGB(0, 200, 0)
Dim oBorderLine As Object = CreateUnoStruct("com.sun.star.table.BorderLine")
Dim oTableBorder As Object = CreateUnoStruct("com.sun.star.table.TableBorder")
With oBorderLine
.Color = RGB(0, 0, 0)
.OuterLineWidth = 1
End With
With oTableBorder
.IsLeftLineValid = True
.IsTopLineValid = True
.IsRightLineValid = True
.IsBottomLineValid = True
.LeftLine = oBorderLine
.TopLine = oBorderLine
.RightLine = oBorderLine
.BottomLine = oBorderLine
End With
mySheet.getCellRangeByName("A2:B3").TableBorder() = oTableBorder
MsgBox(OOoMess105)
myCalc.close(True)
End Sub
インターフェイス・プロパティ・メソッドの一覧を表示するマクロがあったので、こちらも
参考にしてみてくれ!!
sub Main
Dim dbg As object
dbg = CreateUnoService("com.sun.star.sheet.SpreadsheetDocument")
MsgBox(dbg.Dbg_SupportedInterfaces)
MsgBox(dbg.Dbg_Properties)
MsgBox(dbg.Dbg_Methods)
end sub
■参考サイト
OOoMacros
http://www.ooomacros.org/index.php
OOoBasic/Tutorial/kakeibo/macro - ...?
http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic%2FTutorial%2Fkakeibo%2Fmacro
OpenOffice.org 操作術 第 3 回 中本担当分原稿 OpenOffice.org の表 ...
http://bd.tank.jp/nikkei/article3_1.pdf
7. 表計算ドキュメント (StarSuite 8 Basic プログラミングガイド) - Sun Microsystems
http://docs.sun.com/app/docs/doc/819-1332/faail?l=ja&a=view
土曜日, 10月 18, 2008
[VB2005]MonthCalendarのDateChangedイベントが周期的に発生する
MonthCalendarでDateChangedイベントが周期的に発生するんだ。
これはどうしてなんだ?
▼回答
参考サイトより
カレンダーの本日を更新するために約2分間隔でマシン日付をチェックするために発生している
イベントに同期しているらしい。これは、MonthCalendarコントロールのバグらしい。
ユーザが明示的に操作した時にだけイベントを発生させたいなら、DateChangedではなく、DateSelectedイベントを使えばよいようだ。
確かに、DateSelectedイベントを使えば問題ないことがわかった。
DateChangedイベントとDateSelectedイベントの違いは何なんだ?と思って説明を並べてみた。
MonthCalendar.DateChanged イベント
MonthCalendar で選択された日付が変更された場合に発生します。
MonthCalendar.DateSelected イベント
ユーザーがマウスを使用して明示的に日付を選択した場合に発生します。
これを読む限り、通常操作の場合はDateSelected イベントを使えばよいことになるな!
DateChanged イベントを使うのはどんな時なのかと考えてみると、選択された特定の日に
何かをしたい時のイベント処理が考えられるのかな?!
よく考えると、単純に選択(操作)と変更(動作)の違いか!!
■参考サイト
MonthCalendar で予期せぬ DateChanged イベントが発生する
http://blogs.wankuma.com/jeanne/archive/2005/09/02/18244.aspx
DataGridViewの年月日項目に今日の日付が自動設定される?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=41347&forum=7
金曜日, 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
土曜日, 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)
月曜日, 8月 11, 2008
[VB2005]DataGridのセルの色替え
DataGridのセルの色を替えたいんだけど・・・どうしたらできるの?
▼回答
DataGridTextBoxColumnを継承してオリジナルのクラスを作成すればできるよ。
細かいところは、次のサンプルを参照してくれ!!
Public Class DataGridCustomTextBoxColumn
Inherits DataGridTextBoxColumn
Private MyBackColor As Color = SystemColors.Window
Private MyForeColor As Color = SystemColors.WindowText
'/******************************************************************************/
' Paint処理
'/******************************************************************************/
Protected Overloads Overrides Sub Paint(ByVal g As Graphics, _
ByVal bounds As Rectangle, _
ByVal [source] As CurrencyManager, _
ByVal rowNum As Integer, _
ByVal backBrush As Brush, _
ByVal foreBrush As Brush, _
ByVal alignToRight As Boolean)
'基本クラスのPaintメソッドを呼び出す。
MyBase.Paint(g, bounds, source, rowNum, _
New SolidBrush(MyBackColor), _
New SolidBrush(MyForeColor), alignToRight)
End Sub
'''
''' コントロールの背景色を取得または設定します。
'''
'''コントロールの背景色を表す System.Drawing.Color。
Public Property BackColor() As Color
Get
Return MyBackColor
End Get
Set(ByVal value As Color)
MyBackColor = value
End Set
End Property
'''
''' コントロールの前景色を取得または設定します。
'''
'''コントロールの前景色を表す System.Drawing.Color。
Public Property ForeColor() As Color
Get
Return MyForeColor
End Get
Set(ByVal value As Color)
MyForeColor = value
End Set
End Property
End Class
■参考サイト
DataGrid内の特定のセルの色を変える: .NET Tips: C#, VB.NET, Visual Studio
http://dobon.net/vb/dotnet/datagrid/coloredcell.html