乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 55|回复: 3

编辑NamedObjectDict中的值

[复制链接]

50

主题

114

帖子

2

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
314
发表于 2016-6-13 14:20:01 | 显示全部楼层 |阅读模式
我想编辑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()
}
}
}

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2016-6-13 16:33:09 | 显示全部楼层
一个名为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...

}
回复

使用道具 举报

15

主题

687

帖子

169

银币

中流砥柱

Rank: 25

铜币
582
发表于 2016-6-13 16:36:27 | 显示全部楼层
嗨,++与诺曼关于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[I];。
if(值,TypeCode == 66)。
{。
data[i] = new TypedValue(66," 1 ");。
break。
}。
}。
layoutDB,Data = new ResultBuffer(数据);。
}。
trcommit();。
}。
}。
}。
回复

使用道具 举报

50

主题

114

帖子

2

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
314
发表于 2016-6-13 16:56:08 | 显示全部楼层
谢谢你提供的所有信息。Gile:我已经测试了你的代码,它正在做我需要的事情。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 18:43 , Processed in 0.164864 second(s), 60 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表