编辑NamedObjectDict中的值
我想编辑NamedObjectDict中数据的值。它似乎是只读的,所以我想知道是否有其他方法可以实现这一点。这是我到目前为止所做的私有void btnDict_Click(对象发送者,事件参数e)
{
文档doc=AcadApp.DocumentManager.MdiActiveDocument
数据库db=doc.Database
编辑器ed=doc.Editor
使用(doc.LockDocument())
{
使用(Transaction tr=HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction())
{
DBDictionary nod=tr.GetObject(HostApplicationServices.WorkingDatabase.NamedObjectsDictionaryId,OpenMode.ForRead)作为DBDictionary
如果(节点包含(“AcadDim_CRX”)
{
foreach(DBDictionaryEntry de in nod)
{
如果(de.Key==“AcadDim_CRX”)
{
Xrecord布局db=(Xrecord)tr.GetObject(de.Value,OpenMode.ForRead)
字符串c=“”
foreach(layoutDB.Data中的TypedValue值)
{
如果(value.TypeCode==66)是一个值。值=“1”;//------------------------->错误,这是只读的。
}
}
}
}
tr.Commit()
}
}
}
**** Hidden Message ***** 一个名为edDictionary的数据库的直接子代不应该是DBDictionaries吗?也就是说,数据库NamedDictionary的每个DBDictionaryEntry都是DBDictionary的键索引ObjectId。所以,在你的情况下,DBDictionary entry“acad dim _ CRX”应该是DBDictionary,而不是XRecord(嗯,也可能是幕后的XRecord,但至少在。NET API,DBDictionary不是公开从XRecord派生的)。虽然可以将自定义条目作为XRecord直接添加到数据库NamedDictionary中,但这是一种不好的做法。数据库的直接子级。NamedDictionary应该始终是另一个DBDictionary(带有键索引,因此是NamedDictionary)。
因此,您的案例应该是这样的:
...
如果(节点。contains(" acad dim _ CRX ")
{
var the dick =(db dictionary)tr。GetObject(不是。GetAt("AcadDim_CRX ",OpenMode。for read);
//然后在这个命名字典中挖掘每个DBDictionaryEntry,它可能是XRecord或另一个DbDictionary...
} 嗨,++与诺曼关于DBDictionary vs Xrecord作为NOD中的第一个条目。您不需要迭代字典条目,您可以使用键直接访问字典条目(这是字典的主要用途)。不能直接编辑没有TypedValue值的ResultBuffer,您应该将ResultBuffer转换为TypedValue数组,用新的TypedValue替换它,然后重新构建ResultBuffer。未测试的代码: private void BTN dict _ Click(object sender,EventArgs e)。
{。
Document doc = AcadApp,document manager . MdiActiveDocument;。
数据库db = doc,数据库;。
编辑器ed = doc,编辑;。
。
使用(doc,LockDocument())。
{。
使用(Transaction tr = HostApplicationServices,working database . transaction manager . start transaction())。
{。
DBDictionary nod = tr,GetObject(HostApplicationServices,working database . NamedObjectsDictionaryId,OpenMode。ForRead)作为DBDictionary。
。
如果(点头,包含(" acad dim _ CRX ")。
{。
Xrecord layout db =(Xrecord)tr,GetObject(点头,GetAt("AcadDim_CRX "),OpenMode。for write);。
TypedValue[] data = layoutDB,data . as array();。
for(int I = 0;I 。
{。
typed value value = data;。
if(值,TypeCode == 66)。
{。
data = new TypedValue(66," 1 ");。
break。
}。
}。
layoutDB,Data = new ResultBuffer(数据);。
}。
trcommit();。
}。
}。
}。
谢谢你提供的所有信息。Gile:我已经测试了你的代码,它正在做我需要的事情。
页:
[1]