I am working on a vb app and am getting this error when calling a form (frmCaseList) from another form(LoginForm). the frmCaseList wasat one time in a different solution where it worked fine (it was the startup form). frmCaseList is also inside a namespace. If I commentout the .show()
line in the following block the app doesn't fail (but of course, it also doesn't show the form).
Private Sub btnProceed_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProceed.Click
Dim frmCL As DataGridButton.frmCaseList = New DataGridButton.frmCaseList()
frmCL.Show()
End Sub
The above code is from LoginForm. Below is the code for the frmCaseList.
Option Strict Off
Option Explicit On
Imports Microsoft.VisualBasic
Imports System
Imports System.ComponentModel
Imports System.Data
Imports System.Data.Common
Imports System.Data.OleDb
Imports System.Drawing
Imports System.Windows.Forms
Namespace DataGridButton
Public Class frmCaseList
Inherits Form
Private WithEvents dataGrid1 As DataGrid
Private components As Container
'Fields
'Constructors
'Events
'Methods
Public Sub New()
InitializeComponent()
End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBox
Friend WithEvents Button1 As System.Windows.Forms.Button
Private Sub InitializeComponent()
Me.dataGrid1 = New System.Windows.Forms.DataGrid()
Me.TextBox1 = New System.Windows.Forms.TextBox()
Me.ComboBox1 = New System.Windows.Forms.ComboBox()
Me.Button1 = New System.Windows.Forms.Button()
CType(Me.dataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'dataGrid1
'
Me.dataGrid1.Anchor = (((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right)
Me.dataGrid1.DataMember = ""
Me.dataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
Me.dataGrid1.Location = New System.Drawing.Point(32, 48)
Me.dataGrid1.Name = "dataGrid1"
Me.dataGrid1.Size = New System.Drawing.Size(568, 208)
Me.dataGrid1.TabIndex = 0
'
'TextBox1
'
Me.TextBox1.Location = New System.Drawing.Point(32, 8)
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(224, 20)
Me.TextBox1.TabIndex = 1
Me.TextBox1.Text = ""
'
'ComboBox1
'
Me.ComboBox1.Items.AddRange(New Object() {"CaseID", "Case Name", "Defendant"})
Me.ComboBox1.Location = New System.Drawing.Point(264, 7)
Me.ComboBox1.Name = "ComboBox1"
Me.ComboBox1.Size = New System.Drawing.Size(184, 21)
Me.ComboBox1.TabIndex = 2
Me.ComboBox1.Text = "Select Search Field"
'
'Button1
'
Me.Button1.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Button1.Location = New System.Drawing.Point(456, 8)
Me.Button1.Name = "Button1"
Me.Button1.Size = New System.Drawing.Size(144, 20)
Me.Button1.TabIndex = 3
Me.Button1.Text = "Search"
'
'frmCaseList
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(640, 269)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1, Me.ComboBox1, Me.TextBox1, Me.dataGrid1})
Me.Name = "frmCaseList"
Me.Text = "Case List"
Me.WindowState = System.Windows.Forms.FormWindowState.Maximized
CType(Me.dataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
<STAThread()> _
Public Shared Sub Main()
Application.Run(New frmCaseList())
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
' Set the connection and sql strings
' assumes your mdb file is in your root
Dim connString As String = "Provider=sqloledb;data source=ds; initial catalog=cat;uid=user;pwd=pass;" '
Dim sqlString As String = "SELECT CaseID, CaseDocketNumber,CaseName,TrialDate, EffectiveDate FROM Cases Order By EffectiveDate DESC"
Dim dataAdapter As OleDbDataAdapter = Nothing
Dim _dataSet As DataSet = Nothing
Try
' Connection object
Dim connection As New OleDbConnection(connString)
' Create data adapter object
dataAdapter = New OleDbDataAdapter(sqlString, connection)
' Create a dataset object and fill with data using data adapter's Fill method
_dataSet = New DataSet()
dataAdapter.Fill(_dataSet, "customers")
connection.Close()
Catch ex As Exception
MessageBox.Show(("Problem with DB access-" + ControlChars.Lf + ControlChars.Lf + " connection: " + connString + ControlChars.Cr + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf + " query: " + sqlString + ControlChars.Cr + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf + ex.ToString()))
Me.Close()
Return
End Try
' Create a table style that will hold the new column style
' that we set and also tie it to our customer's table from our DB
Dim tableStyle As New DataGridTableStyle()
tableStyle.MappingName = "customers"
' since the dataset has things like field name and number of columns,
' we will use those to create new columnstyles for the columns in our DB table
Dim numCols As Integer = _dataSet.Tables("customers").Columns.Count
' //add an extra column at the end of our customers table
' _dataSet.Tables["customers"].Columns.Add("Button");
Dim aColumnTextColumn As DataGridTextBoxColumn = Nothing
Dim buttonColStyle As DataGridButtonColumn = Nothing
Dim textButtonColStyle As DataGridTextButtonColumn = Nothing
Dim i As Integer = 0
While i < numCols
'add 2 button columns
If i = 0 Then
textButtonColStyle = New DataGridTextButtonColumn(i) 'pass the column#
textButtonColStyle.HeaderText = _dataSet.Tables("customers").Columns(i).ColumnName
textButtonColStyle.MappingName = _dataSet.Tables("customers").Columns(i).ColumnName
'hookup our cellbutton handler...
AddHandler textButtonColStyle.CellButtonClicked, AddressOf HandleCellButtonClick
tableStyle.GridColumnStyles.Add(textButtonColStyle)
'hook the mouse handlers
AddHandler dataGrid1.MouseDown, AddressOf textButtonColStyle.HandleMouseDown
AddHandler dataGrid1.MouseUp, AddressOf textButtonColStyle.HandleMouseUp
'ElseIf i = 5 Then
'buttonColStyle = New DataGridButtonColumn(i) 'pass the column#
'buttonColStyle.HeaderText = _dataSet.Tables("customers").Columns(i).ColumnName
'buttonColStyle.MappingName = _dataSet.Tables("customers").Columns(i).ColumnName
'hookup our cellbutton handler...
'AddHandler buttonColStyle.CellButtonClicked, AddressOf HandleCellButtonClick
'tableStyle.GridColumnStyles.Add(buttonColStyle)
'hook the mouse handlers
'AddHandler dataGrid1.MouseDown, AddressOf buttonColStyle.HandleMouseDown
'AddHandler dataGrid1.MouseUp, AddressOf buttonColStyle.HandleMouseUp
Else ' add standard textbox columns for the other columns
aColumnTextColumn = New DataGridTextBoxColumn()
aColumnTextColumn.HeaderText = _dataSet.Tables("customers").Columns(i).ColumnName
aColumnTextColumn.MappingName = _dataSet.Tables("customers").Columns(i).ColumnName
tableStyle.GridColumnStyles.Add(aColumnTextColumn)
End If
i = i + 1
End While
' make the dataGrid use our new tablestyle and bind it to our table
dataGrid1.TableStyles.Clear()
dataGrid1.TableStyles.Add(tableStyle)
'bind the table to the datagrid
dataGrid1.DataSource = _dataSet.Tables("customers")
AutoSizeTable()
End Sub
Private Sub HandleCellButtonClick(ByVal sender As Object, ByVal e As DataGridCellButtonClickEventArgs)
'MessageBox.Show(("row " + e.RowIndex.ToString() + " col " + e.ColIndex.ToString() + " clicked."))
'MessageBox.Show(dataGrid1(dataGrid1.CurrentCell))
Dim frm As frmCaseInfo = New frmCaseInfo(dataGrid1(dataGrid1.CurrentCell))
frm.Show()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim connString As String = "Provider=sqloledb;data source=testsvr2; initial catalog=solaria;uid=acclaim;pwd=master;" '
Dim sqlString As String
If TextBox1.Text <> "" Then
If ComboBox1.SelectedItem = "Case Name" Then
'MsgBox(ComboBox1.SelectedItem)
sqlString = "SELECT CaseID, CaseDocketNumber,CaseName,TrialDate, EffectiveDate FROM Cases WHERE CaseName Like '%" & TextBox1.Text & "%' Order By EffectiveDate DESC"
ElseIf ComboBox1.SelectedItem = "Defendant" Then
sqlString = "SELECT CaseID, CaseDocketNumber,CaseName,TrialDate, EffectiveDate FROM Cases WHERE " & ComboBox1.SelectedItem & " Like '%" & TextBox1.Text & "%' Order By EffectiveDate DESC"
Else
'MsgBox(ComboBox1.SelectedItem)
sqlString = "SELECT CaseID, CaseDocketNumber,CaseName,TrialDate, EffectiveDate FROM Cases WHERE " & ComboBox1.SelectedItem & " = " & TextBox1.Text & " Order By EffectiveDate DESC"
End If
Else
sqlString = "SELECT CaseID, CaseDocketNumber,CaseName,TrialDate, EffectiveDate FROM Cases"
End If
Dim dataAdapter As OleDbDataAdapter = Nothing
Dim _dataSet As DataSet = Nothing
Try
' Connection object
Dim connection As New OleDbConnection(connString)
' Create data adapter object
dataAdapter = New OleDbDataAdapter(sqlString, connection)
' Create a dataset object and fill with data using data adapter's Fill method
_dataSet = New DataSet()
dataAdapter.Fill(_dataSet, "customers")
connection.Close()
Catch ex As Exception
MessageBox.Show(("Problem with DB access-" + ControlChars.Lf + ControlChars.Lf + " connection: " + connString + ControlChars.Cr + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf + " query: " + sqlString + ControlChars.Cr + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf + ControlChars.Cr + ControlChars.Lf + ex.ToString()))
Me.Close()
Return
End Try
' Create a table style that will hold the new column style
' that we set and also tie it to our customer's table from our DB
Dim tableStyle As New DataGridTableStyle()
tableStyle.MappingName = "customers"
' since the dataset has things like field name and number of columns,
' we will use those to create new columnstyles for the columns in our DB table
Dim numCols As Integer = _dataSet.Tables("customers").Columns.Count
' //add an extra column at the end of our customers table
' _dataSet.Tables["customers"].Columns.Add("Button");
Dim aColumnTextColumn As DataGridTextBoxColumn = Nothing
Dim buttonColStyle As DataGridButtonColumn = Nothing
Dim textButtonColStyle As DataGridTextButtonColumn = Nothing
Dim i As Integer = 0
While i < numCols
'add 2 button columns
If i = 0 Then
textButtonColStyle = New DataGridTextButtonColumn(i) 'pass the column#
textButtonColStyle.HeaderText = _dataSet.Tables("customers").Columns(i).ColumnName
textButtonColStyle.MappingName = _dataSet.Tables("customers").Columns(i).ColumnName
tableStyle.GridColumnStyles.Add(textButtonColStyle)
'hook the mouse handlers
AddHandler dataGrid1.MouseDown, AddressOf textButtonColStyle.HandleMouseDown
AddHandler dataGrid1.MouseUp, AddressOf textButtonColStyle.HandleMouseUp
Else ' add standard textbox columns for the other columns
aColumnTextColumn = New DataGridTextBoxColumn()
aColumnTextColumn.HeaderText = _dataSet.Tables("customers").Columns(i).ColumnName
aColumnTextColumn.MappingName = _dataSet.Tables("customers").Columns(i).ColumnName
tableStyle.GridColumnStyles.Add(aColumnTextColumn)
End If
i = i + 1
End While
' make the dataGrid use our new tablestyle and bind it to our table
dataGrid1.TableStyles.Clear()
dataGrid1.TableStyles.Add(tableStyle)
'bind the table to the datagrid
dataGrid1.DataSource = _dataSet.Tables("customers")
AutoSizeTable()
End Sub
Public Sub AutoSizeTable()
Dim numCols As Integer
numCols = CType(dataGrid1.DataSource, DataTable).Columns.Count
Dim i As Integer
i = 0
Do While (i < numCols)
AutoSizeCol(i)
i = (i + 1)
Loop
End Sub
Public Sub AutoSizeCol(ByVal col As Integer)
Dim width As Single
width = 0
Dim numRows As Integer
numRows = CType(dataGrid1.DataSource, DataTable).Rows.Count
Dim g As Graphics
g = Graphics.FromHwnd(dataGrid1.Handle)
Dim sf As StringFormat
sf = New StringFormat(StringFormat.GenericTypographic)
Dim size As SizeF
Dim i As Integer
i = 0
Do While (i < numRows)
size = g.MeasureString(dataGrid1(i, col).ToString, dataGrid1.Font, 500, sf)
If col = 0 Then
width = size.Width + 40
ElseIf (size.Width > width) Then
width = size.Width
End If
i = (i + 1)
Loop
g.Dispose()
dataGrid1.TableStyles("customers").GridColumnStyles(col).Width = CType(width, Integer)
End Sub
End Class
End Namespace
As a bonus here are the messages in the output window.
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at WindowsApplication2.DataGridButton.DataGridTextButtonColumn.Paint(Graphics g, Rectangle bounds, CurrencyManager source, Int32 rowNum, Brush backBrush, Brush foreBrush, Boolean alignToRight) in C:\Documents and Settings\Administrator\My Documents\Visual Studio Projects\WindowsApplication2\DataGridTextButtonColumn.vb:line 107
at System.Windows.Forms.DataGridRelationshipRow.PaintCellContents(Graphics g, Rectangle cellBounds, DataGridColumnStyle column, Brush backBr, Brush foreBrush, Boolean alignToRight)
at System.Windows.Forms.DataGridRow.PaintData(Graphics g, Rectangle bounds, Int32 firstVisibleColumn, Int32 columnCount, Boolean alignToRight)
at System.Windows.Forms.DataGridRelationshipRow.Paint(Graphics g, Rectangle bounds, Rectangle trueRowBounds, Int32 firstVisibleColumn, Int32 numVisibleColumns, Boolean alignToRight)
at System.Windows.Forms.DataGrid.PaintRows(Graphics g, Rectangle& boundingRect)
at System.Windows.Forms.DataGrid.PaintGrid(Graphics g, Rectangle gridBounds)
at System.Windows.Forms.DataGrid.OnPaint(PaintEventArgs pe)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.ComponentManager.System.Windows.Forms.UnsafeNativeMethods+IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at WindowsApplication2.LoginForm.Main() in C:\Documents and Settings\Administrator\My Documents\Visual Studio Projects\WindowsApplication2\loginForm.vb:line 13The program '[2092] WindowsApplication2.exe' has exited with code 0 (0x0).