读取单元格类型是ObjectId的值报'System.NotImplementedException'。
如果是在当前文件中设置后,直接读取,是可以的。但是保存文件后,再打开再读,就会报错。
private void SaveDataTableButton_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.TableName = "CavityAttr";
dt.AppendColumn(CellType.CharPtr, "cavity");
dt.AppendColumn(CellType.CharPtr, "x");
dt.AppendColumn(CellType.CharPtr, "y");
dt.AppendColumn(CellType.CharPtr, "wdith");
dt.AppendColumn(CellType.CharPtr, "height");
dt.AppendColumn(CellType.ObjectId, "id");
foreach (ListViewItem item in cavityAttrListView.Items)
{
DataCellCollection Row = new DataCellCollection();
DataCell Cavity = new DataCell();
DataCell X = new DataCell();
DataCell Y = new DataCell();
DataCell Wdith = new DataCell();
DataCell Height = new DataCell();
DataCell Id = new DataCell();
Cavity.SetString(item.SubItems[0].Text);
X.SetString(item.SubItems[1].Text);
Y.SetString(item.SubItems[2].Text);
Wdith.SetString(item.SubItems[3].Text);
Height.SetString(item.SubItems[4].Text);
ObjectId id = (ObjectId)item.SubItems[0].Tag;
Id.SetObjectId(id);
Row.Add(Cavity);
Row.Add(X);
Row.Add(Y);
Row.Add(Wdith);
Row.Add(Height);
Row.Add(Id);
dt.AppendRow(Row, true);
}
Document doc = AZcad.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
using (DocumentLock lockDoc = doc.LockDocument())
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
DBDictionary dict = tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForWrite) as DBDictionary;
ObjectId dicId = dict.SetAt("CavityAttr", dt);
dict.UpgradeOpen();
tr.AddNewlyCreatedDBObject(dt, true);
tr.Commit();
}
doc.SendStringToExecute("_qsave\n", false, true, true);
MessageBox.Show("保存成功");
}
}
// 从文件读取DataTable
public static Dictionary<string, string> ReadDataTable(string dwgFile)
{
Dictionary<string, string> cavityAttrInfo = new Dictionary<string, string>();
using (Database blockDb = new Database(false, true))
{
blockDb.ReadDwgFile(dwgFile, System.IO.FileShare.Read, true, null);
blockDb.CloseInput(true);
using (Transaction tr = blockDb.TransactionManager.StartTransaction())
{
DBDictionary nod = tr.GetObject(blockDb.NamedObjectsDictionaryId, OpenMode.ForRead) as DBDictionary;
if (nod.Contains("CavityAttr"))
{
ObjectId myDataId = nod.GetAt("CavityAttr");
DataTable dt = tr.GetObject(myDataId, OpenMode.ForRead) as DataTable;
for (int row = 0; row < dt.NumRows; row++)
{
string cavity = dt.GetCellAt(row, 0).Value.ToString();
string x = dt.GetCellAt(row, 1).Value.ToString();
string y = dt.GetCellAt(row, 2).Value.ToString();
string width = dt.GetCellAt(row, 3).Value.ToString();
string height = dt.GetCellAt(row, 4).Value.ToString();
ObjectId tid = ObjectId.Null;
if (dt.NumColumns > 5)
{
tid = (ObjectId)dt.GetCellAt(row, 5).Value;
}
if (tid != ObjectId.Null)
{
DBObject obj = tr.GetObject(tid, OpenMode.ForRead) as DBObject;
if (obj is DBText)
{
DBText t = (DBText)obj;
cavity = t.TextString;
}
}
cavityAttrInfo[cavity] = string.Format("{0},{1},{2},{3}", x, y, width, height);
}
}
tr.Commit();
}
}
return cavityAttrInfo;
}