|
Windows Forms/VB.Net - Unable to find what triggers System.NullReferenceException
I have a program that will print dwg and idw drawings to different printers.
from our drawing vault we kan use a plotbutton which creates a pcf-file (text file) and copies the drawing to a specific location.
the program reads the pcf file which contains the max printsize for the drawing, who is printing it, nr of copies, location of the drawing.
all data is written to or read from a small database. as long as there are drawings the printing goes fine, they are listed in a datagridview on the form.
As soon as the last record is removed from the datagridview I get the following error:
An unhandled exception of type 'System.NullReferenceException' occurred in System.Windows.Forms.dll
Additional information: Object reference not set to an instance of an object.
but I haven't succeeded to find what is causing this problem.
because if a step through the program it doesn't give the error, if I put a msgbox in the if statement that is deleting the last row it also doesn't give the error.
could someone please help me solve this problem.
here is the text from my form
Code:
Public Class FormPrintTable
Public drwsize, rotation, styletable, printlocation, size1, filepcfarray(), status As String
Private Sub PrintTable_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: This line of code loads data into the 'DsPrintserver.T_PrintTable' table. You can move, or remove it, as needed.
Me.taT_PrintTable.Fill(Me.DsPrintserver.T_PrintTab le)
Do While Me.bsT_PrintTable.Count > 0
Me.bsT_PrintTable.RemoveCurrent()
Me.bsT_PrintTable.EndEdit()
Me.taT_PrintTable.Update(Me.DsPrintserver.T_PrintT able)
Loop
tsslCount.Text = "Record count: " & Me.bsT_PrintTable.Count 'Me.dgvT_PrintTable.RowCount
If Not (My.Computer.FileSystem.DirectoryExists(My.Setting s.DrawingPath)) Or My.Settings.DrawingPath = Nothing Then
MsgBox("There was no valid drawing directory, settings will be opened", MsgBoxStyle.Information, "drawing directory")
FormSettings.ShowDialog()
End If
End Sub
Private Sub tsbStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tsbStart.Click
tsbStart.Enabled = False
Me.Refresh()
bgwPlotList.RunWorkerAsync()
End Sub
Private Sub bgwPlotList_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwPlotList.DoWork
Try
Me.taT_PrintTable.Update(Me.DsPrintserver.T_PrintT able)
Catch ex As Exception
End Try
'----------------------------------------------------------------------------------------------
' Fill PlotDataTable
'----------------------------------------------------------------------------------------------
'Extract the nesscesary information to print drawings from the "*.pcf" file.
'The "*.pcf" files are created by Meridian
Dim filepcfarray() As String
Dim PathDrawing, PathPCF, Name, Priority, Drawing_id, Copies, Printsize As String
If My.Computer.FileSystem.DirectoryExists(My.Settings .DrawingPath) = True Then ' check if directory exists
filepcfarray = Directory.GetFiles(My.Settings.DrawingPath, "*pcf") ' list al "*.pcf" files in array
If filepcfarray.Length() > 0 Then
For teller As Integer = 0 To filepcfarray.Length() - 1
PathPCF = My.Computer.FileSystem.GetFileInfo(filepcfarray(te ller)).FullName
Try
FileOpen(1, filepcfarray(teller), OpenMode.Input) ' open "*.pcf" file
Catch ex As Exception
Continue For
End Try
Dim i As Integer = 0
'*****************Extract data from "*.PCF" File******************
Do While Not EOF(1) ' read "*.pcf" file
Dim Line As String = LineInput(1)
If Line.ToLower.StartsWith("filename") Or Line.ToLower.StartsWith("user") Or _
Line.ToLower.StartsWith("priority") Or Line.ToLower.StartsWith("primkey") Or _
Line.ToLower.StartsWith("numberofcopies") Or Line.ToLower.StartsWith("maxsize") Then
Select Case Line.ToLower.Split("=")(0)
Case "filename"
PathDrawing = Line.ToLower.Split("=")(1)
Dim brandmal As Boolean = False
Try
If PathDrawing.ToLower.Split("-").Length > 1 And Microsoft.VisualBasic.Left(PathDrawing.ToLower.Spl it("-")(3), 1) = "b" Then
brandmal = True
End If
Catch
End Try
If My.Computer.FileSystem.FileExists(PathDrawing) = False Or My.Computer.FileSystem.GetFileInfo(PathDrawing).Le ngth = 0 Or brandmal = True Or (PathDrawing.ToLower.Split(".")(1) <> "dwg" And PathDrawing.ToLower.Split(".")(1) <> "idw") Then
FileClose(1)
If Microsoft.VisualBasic.Left(PathPCF.ToLower.Split("\")(PathPCF.ToLower.Split("\").Length - 1), 2) <> "pt" Then
My.Computer.FileSystem.DeleteFile(PathDrawing)
End If
My.Computer.FileSystem.DeleteFile(PathPCF)
PathDrawing = Nothing
Continue For
End If
Case "user"
Name = Line.ToLower.Split("=")(1)
Case "priority"
Priority = Line.ToLower.Split("=")(1)
Case "primkey"
Drawing_id = Line.ToLower.Split("=")(1)
Case "numberofcopies"
Copies = Line.ToLower.Split("=")(1)
Case "maxsize"
Printsize = Line.ToLower.Split("=")(1)
End Select
End If
Loop
'************************************************* *******************
FileClose(1)
If PathDrawing > Nothing Then
'****************************put data in database***********************
Try
Me.taT_PrintTable.Update(Me.DsPrintserver.T_PrintT able)
Me.taT_PrintTable.Insert(PathDrawing, PathPCF, "waiting", Name, Priority, Drawing_id, Copies, Printsize)
If Me.InvokeRequired Then
Dim frmRefresh As New RefreshForm(AddressOf FormRefresh)
Me.Invoke(frmRefresh)
Else
FormRefresh()
End If
Catch ex As Exception
End Try
'************************************************* ***********************
'****************start printing drawings*********************************
' MsgBox(Me.dgvT_PrintTable.Rows.Count)
If Me.dgvT_PrintTable.Rows.Count > 0 Then
Try
status = Me.dgvT_PrintTable.Item("dgvcStatus", 0).Value
Catch ex As Exception
MsgBox("status error")
End Try
' MsgBox(Me.dgvT_PrintTable.Rows.Count)
'MsgBox(status)
If status = "waiting" And bgwAcadInv.IsBusy = False Then
Me.DsPrintserver.T_PrintTable.Rows(0).Item("Status") = "printing"
Try
Me.taT_PrintTable.Update(Me.DsPrintserver.T_PrintT able)
Catch ex As Exception
End Try
bgwAcadInv.RunWorkerAsync()
ElseIf status = "printed" Then
Try
My.Computer.FileSystem.DeleteFile(Me.DsPrintserver .T_PrintTable.Rows(0).Item(1).ToString) ' delete PCF File
Catch
End Try
If Microsoft.VisualBasic.Left(Me.DsPrintserver.T_Prin tTable.Rows(0).Item(1).split("\")(Me.DsPrintserver.T_PrintTable.Rows(0).Item(1).sp lit("\").length - 1), 2) <> "PT" Then 'als het geen ISAH pcf is
Try
My.Computer.FileSystem.DeleteFile(Me.DsPrintserver .T_PrintTable.Rows(0).Item(0)) 'verwijderen dwg file
Catch
End Try
End If
Me.dgvT_PrintTable.Rows.RemoveAt(0)
Me.bsT_PrintTable.RemoveAt(0)
Me.bsT_PrintTable.EndEdit()
Try
Me.taT_PrintTable.Update(Me.DsPrintserver.T_PrintT able)
Catch ex As Exception
End Try
If Me.InvokeRequired Then
Try
Dim frmRefresh As New RefreshForm(AddressOf FormRefresh)
Me.Invoke(frmRefresh)
Catch ex As Exception
End Try
Else
FormRefresh()
End If
End If
End If
'************************************************* ***********************
End If
Next
End If
End If
'Thread.Sleep(5000)
End Sub
Private Sub bgwPlotList_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwPlotList.RunWorkerCompleted
Try
FormRefresh()
Catch ex As Exception
End Try
bgwPlotList.RunWorkerAsync()
End Sub
Private Sub bgwAcadInv_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwAcadInv.DoWork
'----------------------------------------------------------------------------------------------
' Print drawings
'----------------------------------------------------------------------------------------------
Dim EntryObjectName, EntryName As String
'Select Case Me.DsPrintserver.T_PrintTable.Rows(0).Item("Pathdrawing").ToString.ToLower.Split(".")(1)
Dim EXT As String
rtEXT: Try
EXT = Me.dgvT_PrintTable.Item("dgvcPathDrawing", 0).Value.ToString.ToLower.Split(".")(1)
Catch ex As Exception
GoTo rtEXT
End Try
Select Case EXT
Case "dwg" 'determine what the drawingsize is of the printed acad drawing
OpenTryA: Try
'Acad.Documents.Open(Me.DsPrintserver.T_PrintTable .Rows(0).Item("Pathdrawing").ToString, True) 'openen autocad tekeningen
Acad.Documents.Open(Me.dgvT_PrintTable.Item("dgvcPathDrawing", 0).Value.ToString, True) 'openen autocad tekeningen
Dim entry As Object
For Each entry In Acad.activedocument.ModelSpace
EntryObjectName = entry.objectname
If EntryObjectName = "AcDbBlockReference" Then
EntryName = entry.name
Select Case EntryName.ToLower
Case "4", "gen_4", "4m", "", "manvatc", "gen_4m", "0-kadernieuw"
drwsize = "4"
Exit For
Case "3", "gen_3"
drwsize = "3"
Exit For
Case "2", "gen_2"
drwsize = "2"
Exit For
Case "1", "gen_1"
drwsize = "1"
Exit For
Case "0", "gen_0"
drwsize = "0"
Exit For
'Case Else
' drwsize = "4"
' Exit For
End Select
End If
Next
Catch
GoTo OpenTryA
' Exit Try
End Try
Case "idw" 'determine what the drawingsize is of the printed inventor drawing
Invent = CreateObject(My.Settings.Inventorversie) 'maak object en open inventor
'Invent.Visible = True
Invent.Visible = False
Invent.SilentOperation = True
OpenTryI: Try
Invent.Documents.Open(Me.dgvT_PrintTable.Item("dgvcPathDrawing", 0).Value.ToString, True) 'openen inventor tekeningen
Select Case Invent.activedocument.activesheet.size
Case "9997"
drwsize = "4"
Case "9996"
drwsize = "3"
Case "9995"
drwsize = "2"
Case "9994"
drwsize = "1"
Case "9993"
drwsize = "0"
Case Else
drwsize = "4"
End Select
Catch
GoTo OpenTryI
' Exit Try
End Try
End Select
'********************* maximal printsize determend by user*********************
Dim actualsize As String
styletable = My.Settings.StyleMonoA4
Try
prnt = Invent.activedocument.printmanager
Catch
End Try
Dim PS As String
rtPS: Try
PS = Me.dgvT_PrintTable.Item("dgvcPrintSize", 0).Value.ToString
Catch ex As Exception
GoTo rtPS
End Try
Select Case PS
Case "6" '*****Print drawings as PDF A4*****
actualsize = "6"
styletable = My.Settings.StyleSlim
Try
prnt.ScaleMode = My.Settings.kPrintBestFitScale
Catch
End Try
Case "5" '*****Print drawings as PDF A3*****
actualsize = "5"
styletable = My.Settings.StyleSlim
Try
prnt.ScaleMode = My.Settings.kPrintBestFitScale
Catch
End Try
Case "4", "-1" '*****Print drawings max. papersize A4*****
Select Case drwsize
Case "4"
actualsize = drwsize
Case Else
actualsize = "4"
If drwsize <> "3" Then styletable = My.Settings.StyleMono
If drwsize <> "4" Then
Try
prnt.ScaleMode = My.Settings.kPrintBestFitScale
Catch
End Try
End If
End Select
Case "3" '*****Print drawings max. papersize A3*****
Select Case drwsize
Case "4"
actualsize = drwsize
Case Else
actualsize = "3"
If drwsize <> "2" And drwsize <> "3" Then styletable = My.Settings.StyleMono
If drwsize <> "3" Then
Try
prnt.ScaleMode = My.Settings.kPrintBestFitScale
Catch
End Try
End If
End Select
Case "2" '*****Print drawings max. papersize A2*****
Select Case drwsize
Case "4", "3"
actualsize = drwsize
Case Else
actualsize = "2"
If drwsize <> "1" And drwsize <> "2" Then styletable = My.Settings.StyleMono
If drwsize <> "2" Then
Try
prnt.ScaleMode = My.Settings.kPrintBestFitScale
Catch
End Try
End If
End Select
Case "1" '*****Print drawings max. papersize A1*****
Select Case drwsize
Case "4", "3", "2"
actualsize = drwsize
Case Else
actualsize = "1"
If drwsize <> "1" Then
Try
prnt.ScaleMode = My.Settings.kPrintBestFitScale
Catch
End Try
End If
End Select
Case "0" '*****Print drawings max. papersize A0*****
Select Case drwsize
Case "4", "3", "2", "1"
actualsize = drwsize
Case Else
actualsize = "0"
End Select
End Select
'************************************************* *******************************
' Dim user As String = Me.DsPrintserver.T_PrintTable.Rows(0).Item("name") 'is the user from the first row of the table
Dim user As String
rtUser: Try
Do While user = Nothing
user = Me.dgvT_PrintTable.Item("dgvcName", 0).Value 'is the user from the first row of the table
Loop
Catch ex As Exception
GoTo rtUser
End Try
Me.taT_Company_Employees.fbT_Company_Employees(Me. DsPrintserver.T_Company_Employees, user) 'SQL: SELECT DISTINCT Department FROM(T_Company_Employees) WHERE (Name = ?)
Dim department As String = Me.DsPrintserver.T_Company_Employees.Rows(0).Item( "Department") 'is the result from previous query
'------------------------------ determination of printlocation Autocad-------------------------
Me.taT_printlocation.fbPrintLocation(Me.DsPrintser ver.T_printlocation, actualsize, department) 'SQL: SELECT DISTINCT PrinterLocation FROM(T_PrintLocation) WHERE (PaperSize = ?) AND (Department = ?)
printlocation = Me.DsPrintserver.T_printlocation.Rows(0).Item("PrinterLocation") 'is the result from the previous query for the printlocation
'------------------------------ determination of printlocation Inventor------------------------
Try
prnt.printer = printlocation
Catch
End Try
'------------------------------ determination of Papersize name Autocad -----------------------
Me.taT_Printer.fbT_Printer(Me.DsPrintserver.T_Prin ter, printlocation, actualsize) 'SQL: SELECT DISTINCT Sizename, Rotation FROM(T_Printer) WHERE PrinterLocation = ?) AND (PaperSize = ?)
size1 = Me.DsPrintserver.T_Printer.Rows(0).Item("Sizename") 'is the result from the previous query for the sizename
'------------------------------ determination of Papersize name Inventor-----------------------
Try
If size1.Contains("A4") Then
prnt.papersize = My.Settings.kPaperSizeA4
ElseIf size1.Contains("A3") Then
prnt.papersize = My.Settings.kPaperSizeA3
ElseIf size1.Contains("A2") Then
prnt.papersize = My.Settings.kPaperSizeA2Oversize
ElseIf size1.Contains("A1") Then
prnt.papersize = My.Settings.kPaperSizeA1Oversize
ElseIf size1.Contains("A0") Then
prnt.papersize = My.Settings.kPaperSizeA0Oversize
End If
Catch
End Try
'------------------------------ determination of rotation Autocad & Inventor-------------------
If Me.DsPrintserver.T_Printer.Rows(0).Item("rotation").ToString = Nothing Then 'uses the result from the query "fbT_Printer" for the rotation
' juiste afdruk rotatie selecteren
If (actualsize = 6 And drwsize = 4) Or (actualsize = 5 And drwsize = 4) Or (actualsize = 4 And drwsize = 4) Then
rotation = "portrait"
Try
prnt.orientation = My.Settings.kPortraitOrientation
Catch
End Try
Else
rotation = "landscape"
Try
prnt.orientation = My.Settings.kLandscapeOrientation
Catch
End Try
End If
ElseIf Me.DsPrintserver.T_Printer.Rows(0).Item("rotation").ToString.ToLower = "portrait" Then
rotation = Me.DsPrintserver.T_Printer.Rows(0).Item("rotation")
Try
prnt.orientation = My.Settings.kPortraitOrientation
Catch
End Try
Else
rotation = "landscape"
Try
prnt.orientation = My.Settings.kLandscapeOrientation
Catch
End Try
End If
'*************************Printen***************** ******************************************
'Select Case Me.DsPrintserver.T_PrintTable.Rows(0).Item("PathDrawing").ToString.ToLower.Split(".")(1)
Select Case EXT
Case "dwg"
For plotcopy As Integer = 1 To Me.DsPrintserver.T_PrintTable.Rows(0).Item("copies") 'print requested copies
TryPrintA: Try
'-----------------plottext Autocad-------------------------------------------------
Acad.Activedocument.SendCommand("cmddia" + Chr(13) + "0" + Chr(13))
Acad.Activedocument.SendCommand("filedia" + Chr(13) + "0" + Chr(13))
Acad.Activedocument.SendCommand("-plot" + Chr(13) + "Y" + Chr(13) + "model" _
+ Chr(13) + printlocation + Chr(13) + size1 + Chr(13) + My.Settings.Units + Chr(13) + rotation _
+ Chr(13) + "n" + Chr(13) + My.Settings.Area + Chr(13) + My.Settings.Scale1 + Chr(13) + My.Settings.Offset + Chr(13) _
+ My.Settings.Styles + Chr(13) + styletable + Chr(13) + My.Settings.Lineweight + Chr(13) + "n" + Chr(13) + "n" _
+ Chr(13) + "n" + Chr(13) + "yes" + Chr(13))
Acad.Activedocument.SendCommand("cmddia" + Chr(13) + "1" + Chr(13))
Acad.Activedocument.SendCommand("filedia" + Chr(13) + "1" + Chr(13))
Catch ex As Exception
GoTo TryPrintA
End Try
Next
Acad.activedocument.close(False, Me.dgvT_PrintTable.Item("dgvcPathDrawing", 0).Value) 'close autocad drawing
Case "idw"
For plotcopy As Integer = 1 To Me.DsPrintserver.T_PrintTable.Rows(0).Item("copies") 'print requested copies
TryPrintI: Try
prnt.SubmitPrint()
Catch ex As Exception
GoTo TryPrintI
End Try
Next
Invent.activedocument.dirty = False
Dim processList() As Process
processList = Process.GetProcessesByName("inventor")
For Each proc As Process In processList
proc.Kill() 'kill the process of inventor to close inventor
Next
'Invent.activedocument.close(True) 'close inventor drawing
'Invent.activedocument.close(False) 'close inventor drawing
End Select
Try
Me.dgvT_PrintTable.Item("dgvcStatus", 0).Value = "printed"
Me.DsPrintserver.T_PrintTable.Rows(0).Item("Status") = "printed"
Me.taT_PrintTable.Update(Me.DsPrintserver.T_PrintT able)
Catch ex As Exception
End Try
End Sub
Private Delegate Sub RefreshForm()
Private Sub FormRefresh()
Try
Me.taT_PrintTable.Fill(Me.DsPrintserver.T_PrintTab le)
tsslCount.Text = "Record count: " & Me.bsT_PrintTable.Count 'Me.dgvT_PrintTable.RowCount
Me.Refresh()
Catch ex As Exception
End Try
End Sub
Private Sub dgvT_PrintTable_DataError(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArg s) Handles dgvT_PrintTable.DataError
' MsgBox("help")
status = "null"
e.Cancel = True
End Sub
End Class
greetings Simone
|