我正在用C#.NET编写一个AutoCAD插件,我需要一种将Table.IsReadEnabled和Table.IsWriteEnabled设置为true的方法。这里显示了一个名为addRow()的方法:
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调用将表的IsReadEnabled和IsWriteEnabled设置为false,即使使用OpenClose事务也是如此。这将导致AutoCAD在试图向表中添加新的数据行时崩溃。我需要在tr.commit调用之后重新启用写入和读取,或者设置它,这样就不会禁用写入和读取。
发布于 2014-10-16 13:19:28
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语句!
发布于 2014-10-15 06:09:10
我认为您应该使用StartTransaction而不是StartOpenCloseTransaction。见附件中的博客。
干杯,阿兰
http://spiderinnet1.typepad.com/blog/2012/08/autocad-net-openclosetransaction-can-it-be-nested.html
发布于 2014-12-09 20:38:09
最有可能的情况是,当先前的事务没有正确地处理时,就会发生此错误。问题中的"addRow“函数就是如何不编码的例子。始终使用C#“使用”语句启动事务。它确保事务被正确地处理。检查并修复代码中启动事务的所有位置。
using(OpenCloseTransaction tr = doc.TransactionManager.StartOpenCloseTransaction())
{
// your logic here
}https://stackoverflow.com/questions/26367657
复制相似问题