void AddColumn(string name, Type type) { if (mMap != null && mMap.Editing) { try { Layer sLayer = (Layer)dataGridView1.Tag; sLayer.AddField(name, type); } catch (Exception ea) { MessageBox.Show(ea.Message, "出错"); } } }
//读dbf文件 private static void ReadDbf(ref Layer layer, string fileName) { int sIndex = fileName.LastIndexOf("\\"); string sName = fileName.Substring(0, fileName.Length - 4) + ".dbf"; //FileStream fs = null; //BinaryReader br = null; using (FileStream fs = new FileStream(sName, FileMode.Open, FileAccess.Read)) { using (BinaryReader br = new BinaryReader(fs)) { //(1)读文件头 byte Vertion = br.ReadByte(); //版本信息 //更新日期 byte Year = br.ReadByte(); byte Mouth = br.ReadByte(); byte Day = br.ReadByte(); Int32 RecordNum = br.ReadInt32(); //记录条数 Int16 HeadLength = br.ReadInt16(); //文件头字节数 Int16 RecordLength = br.ReadInt16(); //一条记录的字节长度 br.ReadBytes(20); //跳过保留字节、dBASE IV编密码标记、MXD标识等信息 int FieldsCount = (HeadLength - 32) / 32; //表中记录项的个数 Byte[] FieldLength = new Byte[FieldsCount]; //各记录项的长度 for (int i = 0; i < FieldsCount; i++) //读取各个记录项描述信息 { Byte[] sFieldName = br.ReadBytes(11); //记录项名称 string FieldName = Encoding.GetEncoding("GBK").GetString(sFieldName).Trim(); //将记录项名称转为字符串 Byte FieldType = br.ReadByte(); //记录项数据类型 br.ReadBytes(4); //跳过保留字节 FieldLength[i] = br.ReadByte(); //记录项长度 Byte DemicalCount = br.ReadByte(); //记录项精度 br.ReadBytes(14); //跳过保留字节、工作区ID、MDX标识 if (FieldType == 67) //记录项是字符型 { layer.AddField(FieldName, typeof(string)); layer.Records.Columns[Layer.FIELD_START_INDEX + i].MaxLength = FieldLength[i]; } else if (FieldType == 78)//记录项是数值型 { if (DemicalCount == 0) { layer.AddField(FieldName, typeof(Int32)); } else { layer.AddField(FieldName, typeof(double)); } } else { layer.AddField(FieldName, typeof(string)); layer.Records.Columns[Layer.FIELD_START_INDEX + i].MaxLength = FieldLength[i]; } } byte Terminator = br.ReadByte();//记录项终止标识 //(2)读文件记录 Byte[] svalue; Int32 sint; Double sdouble; string str; for (int i = 0; i < RecordNum; i++) //逐条记录进行读取 { br.ReadByte(); //每条记录开头是一个空字符 for (int j = 0; j < FieldsCount; j++) //读取记录中的每个记录项 { svalue = br.ReadBytes(FieldLength[j]); if (layer.Records.Columns[j + Layer.FIELD_START_INDEX].DataType == typeof(Int32)) { try { str = Encoding.ASCII.GetString(svalue); if (Int32.TryParse(str, out sint)) { layer.Records.Rows[i][j + Layer.FIELD_START_INDEX] = sint; } } catch (Exception)//文件中可能有非法字符或浮点数,遇到则不显示或进行转换 { try { str = Encoding.ASCII.GetString(svalue); if (Double.TryParse(str, out sdouble)) { layer.Records.Rows[i][j + Layer.FIELD_START_INDEX] = (double)sdouble; } } catch (Exception) { } } } else if (layer.Records.Columns[j + Layer.FIELD_START_INDEX].DataType == typeof(Double)) { try { str = Encoding.ASCII.GetString(svalue); if (Double.TryParse(str, out sdouble)) { layer.Records.Rows[i][j + Layer.FIELD_START_INDEX] = sdouble; } } catch (Exception) { } } else if (layer.Records.Columns[j + Layer.FIELD_START_INDEX].DataType == typeof(string)) { layer.Records.Rows[i][j + Layer.FIELD_START_INDEX] = Encoding.GetEncoding("GBK").GetString(svalue).Trim(); } } } } } }