2014-10-14 1 views
3

C# .NET에서 AutoCAD 플러그인을 프로그래밍하고 있습니다. Table.IsReadEnabledTable.IsWriteEnabledtrue으로 설정하는 방법이 필요합니다. 나는 addRow()라는 방법이 여기에 표시가 있습니다AutoCAD eNotOpenForWrite

public void addRow(String[] data) 
     { 
      OpenCloseTransaction tr = doc.TransactionManager.StartOpenCloseTransaction(); 
      DocumentLock docLock = doc.LockDocument(); 
      using (tr) 
      using (docLock) 
      { 
       bool isRead = IsReadEnabled; 
       bool isWrite = IsWriteEnabled; 

       BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead); 
       BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[Autodesk.AutoCAD.DatabaseServices.BlockTableRecord.ModelSpace], OpenMode.ForWrite); 

       selectedRow++; //Sets the lowest empty row as the one to be modified 

       //Adding data to each cell 
       for (int i = 0; i < data.Length; i++) 
       { 
        Cells[selectedRow, i].SetValue(data[i], ParseOption.SetDefaultFormat); 
       } 
       GenerateLayout(); 

       //Attempting to update database with new data 

       btr.AppendEntity(this); 
       tr.AddNewlyCreatedDBObject(this, true); 

       tr.Commit(); 

      } 
     } 

그것이 잘 작동하지만 tr.Commit 호출에도 OpenClose 트랜잭션 테이블의 IsReadEnabledIsWriteEnabled false로 설정합니다 내 테이블에 데이터를 추가하는 첫 번째 시간입니다. 이로 인해 AutoCAD는 테이블에 새로운 데이터 행을 추가하려고 할 때 충돌이 발생합니다. tr.commit 콜 이후에 쓰기 및 읽기를 다시 활성화하거나 쓰기 및 읽기가 비활성화되지 않도록 설정해야합니다.

답변

1
if (!IsWriteEnabled || !IsReadEnabled) //Committing transactions closes everything for reading and writing so it must be reopened 
{ 
    tr.GetObject(this.ObjectId, OpenMode.ForRead); 
    tr.GetObject(this.ObjectId, OpenMode.ForWrite); 
} 

난 그냥 if 문 추가 할 필요!

+0

이것을 허용으로 표시해야 하는가? – Mike

+0

나는 3 시간 동안은 더 이상 할 수 없다는 것을 제외하고는 사랑하고 싶다. –

0

대부분의 경우 이전 트랜잭션이 올바르게 처리되지 않은 경우이 오류가 발생합니다. 질문에서 "addRow"함수는 코딩하지 않는 방법의 예입니다. 항상 C# "using"문을 사용하여 트랜잭션을 시작하십시오. 거래가 제대로 처리되었는지 확인합니다. 거래를 시작한 코드의 모든 부분을 검토하고 수정하십시오.

using(OpenCloseTransaction tr = doc.TransactionManager.StartOpenCloseTransaction()) 
{ 
    // your logic here 
} 
0

정확한 예외를 얻으려면 try catch를 사용하십시오. 또한 거래가 누락되었습니다.