datagrid错误:调用目标引发了异常

时间:2016-06-02 15:19:03

标签: vb.net autocad-plugin

我正在使用AutoCAD插件。以下三个功能来自AutoCAD的课程,由Jerry Winters编写。我正在使用这些函数来获取我需要的数据并将其传递到数据网格中。

    Function SelectAllBlocks(dbIn As Database) As ObjectIdCollection
    Dim retIDs As New ObjectIdCollection
    Using myTrans As Transaction = dbIn.TransactionManager.StartTransaction
        Dim myBT As BlockTable = dbIn.BlockTableId.GetObject(OpenMode.ForRead)
        For Each btrID As ObjectId In myBT
            Dim myBTR As BlockTableRecord = btrID.GetObject(OpenMode.ForRead)
            For Each BRefID As ObjectId In myBTR.GetBlockReferenceIds(True, False)
                retIDs.Add(BRefID)
            Next
        Next
    End Using
    Return retIDs
End Function
Function GetBlockProperties(ObjID As ObjectId) As Dictionary(Of String, Object)
    Dim myD As New Dictionary(Of String, Object)
    Using myTrans As Transaction =
    ObjID.Database.TransactionManager.StartTransaction
        Dim myEnt As BlockReference =
        ObjID.GetObject(OpenMode.ForRead)
        For Each myPInfo As Reflection.PropertyInfo In GetType(BlockReference).GetProperties
            myD.Add(myPInfo.Name, myPInfo.GetValue(myEnt))
        Next
    End Using
    Return myD
End Function
Function GetBTRProperties(ObjID As ObjectId) As Dictionary(Of String, Object)
    Dim myD As New Dictionary(Of String, Object)
    Using myTrans As Transaction =
    ObjID.Database.TransactionManager.StartTransaction
        Dim myEnt As BlockTableRecord =
        ObjID.GetObject(OpenMode.ForRead)
        For Each myPInfo As System.Reflection.PropertyInfo In GetType(BlockTableRecord).GetProperties
            myD.Add(myPInfo.Name, myPInfo.GetValue(myEnt))
        Next
    End Using
    Return myD
End Function

我的代码尝试根据自己的需要重写课程中的一些材料,将一些信息加载到数据网格中,但抛出了一个"调用目标引发了异常" ;错误。

    Private Sub cmdBlocks_Click(sender As Object, e As EventArgs) Handles cmdBlocks.Click
    Dim tbl As New System.Data.DataTable
    ' Create four typed columns in the DataTable.
    tbl.Columns.Add("User name", GetType(String))
    tbl.Columns.Add("Full name", GetType(String))
    tbl.Columns.Add("Time", GetType(String))
    tbl.Columns.Add("name", GetType(String))
    tbl.Columns.Add("Block handle", GetType(String))
    tbl.Columns.Add("Block name", GetType(String))
    tbl.Columns.Add("Location X", GetType(String))
    tbl.Columns.Add("Location Y", GetType(String))
    tbl.Columns.Add("Location Z", GetType(String))
    dgvBlocks.DataSource = tbl
    Dim myDB As Database = HostApplicationServices.WorkingDatabase,
        myIDs As ObjectIdCollection = SelectAllBlocks(myDB)
    Using myTrans As Transaction = myDB.TransactionManager.StartTransaction
        For Each myBID As ObjectId In myIDs
            Dim blockProps As Dictionary(Of String, Object) = GetBlockProperties(myBID)
            Dim blockProps2 As Dictionary(Of String, Object) = GetBTRProperties(blockProps("DynamicBlockTableRecord"))
            Dim blockAtts As Dictionary(Of String, Dictionary(Of String, String)) = GetBlockAttributes(myBID)
            Dim username As String = My.Computer.Name,
                filename As String = HostApplicationServices.WorkingDatabase.Filename,
                time As String = DateTime.UtcNow,
                Name As String = blockProps2("Name"),
                BlockHandle As String = blockProps("Handle").ToString,
                BlockName As String = blockProps("BlockName").ToString,
                location As Point3d = blockProps("Position"),
                locX As String = location.X.ToString,
                locY As String = location.Y.ToString,
                locZ As String = location.Z.ToString
            tbl.Rows.Add(username, filename, time, Name, BlockHandle, BlockName, locX, locY, locZ)
        Next
        myTrans.Abort()
    End Using
End Sub

1 个答案:

答案 0 :(得分:1)

当您尝试从无模式窗体或调色板(也是无模式)修改数据库时,通常会发生“eLockViolation”异常。

以下是锁定它的方法:

Using docLock As DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument()
    ' do your code here...
End Using

通常你会调用一次,这意味着即使你有多个事务,每个操作一次锁定来更改数据库,但你可能会考虑每个事务一个锁,以便更容易实现(尽管成本更高)。