自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

HerryDong的博客

Hi,别来无恙

  • 博客(205)
  • 问答 (1)
  • 收藏
  • 关注

原创 ASP.NET Core 3.1系列(30)——Newtonsoft.Json实现JSON的序列化和反序列化

在早期版本的项目中,的使用率非常高。虽然微软当前主推来处理JSON的序列化和反序列化,但在这方面做的也是相当不错,下面就来介绍一下它的用法。本文主要介绍了的使用方法。其实和的使用方法都很简便,具体在项目中使用哪个序列化工具可根据情况自行决定。

2023-01-16 14:51:05 251

原创 ASP.NET Core 3.1系列(29)——System.Text.Json实现JSON的序列化和反序列化

在Web开发中,JSON数据可以说是无处不在。由于具有轻量、易读等优点,JSON已经成为当前主流的数据传输格式。在之前,大多数项目都会使用组件来实现JSON的序列化和反序列化操作,而从开始,微软提供的已经相当出色,其效率相比前者可以说是有过之而无不及,下面就来介绍一下它的使用方法。本文简单介绍了中关于JSON序列化和反序列化操作,主要通过来实现。如果你觉得微软提供的JSON序列化工具不好用,那也可以使用,我也会在下一篇博客中介绍关于的使用方法。

2023-01-15 16:52:49 335

原创 ASP.NET Core 3.1系列(28)——ASP.NET Core中使用Autofac替换内置IoC容器

前面的博客主要介绍了一些Autofac的使用方法,示例代码都是基于控制台程序。本文就来介绍一下如何在中使用Autofac代替内置的IoC容器。本文主要介绍了在中使用Autofac代替内置IoC容器的方法。相较于内置的IoC容器,Autofac功能更加丰富、使用更加灵活,在实际业务中合理使用Autofac可以极大提升开发效率,同时也更加便于项目后期的维护。

2023-01-15 10:55:13 418

原创 ASP.NET Core 3.1系列(27)——Autofac使用JSON、XML配置文件

很多IoC框架都支持以配置文件的形式实现接口和类的注册,Autofac当然也不例外。本文就来介绍一下如何利用JSONXML等配置文件来实现接口和类的注册。Repository} }} }} } }} } }Service} }} }} } }} } }本文简单介绍了Autofac使用XMLJSON等配置文件实现接口和类注册的方法。在官方文档里还有很多其他的配置节点参数,有兴趣的同志可以自行深入了解。

2023-01-13 15:48:36 376

原创 ASP.NET Core 3.1系列(26)——Autofac中的实例生命周期

前面的博客主要介绍了Autofac中的一些注册方法,下面就来介绍一下Autofac中实例的生命周期。之前在介绍内置IoC瞬时生命周期域生命周期全局单例生命周期,而Autofac在这三种周期之上又新增了若干周期模式,下面开始介绍。本文主要介绍了Autofac中实例的生命周期。一般情况下,瞬时域单例三种周期模式应用较多,而其他的周期模式则相对较少,有兴趣的同志可以查看Autofac官方文档进行深入了解。

2023-01-13 10:43:18 366

原创 ASP.NET Core 3.1系列(25)——Autofac中的泛型注册和程序集注册

在实际开发业务中,泛型的应用非常广泛,而这也就产生了一个问题:泛型类和泛型接口该怎么注册?难道要开发者一行一行去写泛型构造参数吗?同时,实际业务中往往也会对项目进行分层设计,例如接口层、实现层。对于这种处于不同程序集的接口和类,又有没有什么高效的方法对其进行处理呢?本文就来介绍一下如何利用Autofac来处理这两类问题。本文主要介绍了Autofac中的泛型注册和程序集注册,这两种注册方法具有非常高的实用性。

2023-01-13 10:15:50 386

原创 ASP.NET Core 3.1系列(24)——依赖注入框架之Autofac

前面的博客已经介绍过中内置IoC容器的使用方法。对于规模较小的项目来说,内置容器完全够用。但在实际开发业务中,一般更推荐开发者使用Autofac作为系统的IoC容器。相较于微软提供的内置容器,Autofac无论是在功能性还是灵活性上都更胜一筹,下面开始介绍它的使用方法。本文主要介绍了Autofac的基础使用方法。其实Autofac中还包含一些高效灵活的注册方法,例如程序集批量注册、泛型注册等等,合理使用这些方法能够极大地提升开发效率,后续博客会对这些方法进行逐一介绍。

2023-01-12 11:59:23 241

原创 ASP.NET Core 3.1系列(23)——使用AutoMapper实现实体之间的相互转换

在之前的博客中,我们通过EFCore的命令一键生成数据库实体类。但在实际业务中,实体类并不能很好地应对所有情况。例如前端页面只需要展示某张表中部分字段的信息,这时如果直接将实体类集合返回给前端界面,就有可能造成数据的冗余和泄露问题。而在某些情况下,前端界面需要展示的字段信息可能并不包含在当前的实体类中。因此在实际业务中,可以考虑定义一系列的DTO实体类来解决上述问题,这也就涉及到实体类之间的相互转换问题。在中,一般推荐使用AutoMapper来实现实体转换操作,下面开始介绍它的用法。本文主要介绍了。

2023-01-10 14:32:09 205

原创 ASP.NET Core 3.1系列(22)——封装EFCore中通用的CRUD操作

在前面的博客中,我们采用在Controller的构造函数中直接注入数据库上下文DbContext的方法实现数据库的一些常规操作,这种方法比较适合规模较小的项目。而一旦项目规模上升、数据库中的表的数量较多时,还是要考虑对EFCore中的CURD操作进行一下适度的封装,下面开始介绍。本文主要介绍了如何封装EFCore中常见的CRUD操作。在原先时代,开发者会封装仓储层Repository和工作单元UnitOfWork,虽然我之前也会这么做,但后来发现很多情况下其实不需要这两层,EFCore。

2023-01-09 14:58:11 153

原创 ASP.NET Core 3.1系列(21)——EFCore中的更新实体操作

前面的博客已经介绍过EFCore中关于新增和删除实体的相关操作,本文开始介绍EFCore中的更新实体操作。与新增实体和删除实体相比,更新实体的操作略微有些复杂,如果在代码的写法上不多加注意,那就很有可能会在后台生成效率低下的SQL,下面开始介绍。EFCore中的更新操作略微有些复杂,正确理解每种更新操作生成的SQL是把控程序效率的关键。

2022-12-28 16:04:46 561 6

原创 ASP.NET Core 3.1系列(20)——EFCore中的删除实体操作

前一篇博客介绍了EFCore中添加实体的相关内容,本文开始介绍与之对应的删除实体操作。本文主要介绍了EFCore中删除实体的相关内容。在数据量较大的情况下,开发者可以考虑使用使用原生SQL或借助于第三方库实现大批量数据的删除操作。

2022-12-20 13:37:19 306

原创 ASP.NET Core 3.1系列(19)——EFCore中的添加实体操作

前面介绍了EFCore中关于查询和执行原生SQL的操作,这篇博客就来介绍一下EFCore中添加实体的相关操作。关于添加实体,EFCore提供了多种方法供开发者使用。但EFCore中针对实体的一系列操作最终都会被转换成SQL,因此这些方法之间也存在着一些差异,下面开始介绍。本文主要介绍了EFCore中添加实体的相关操作。在实际开发过程中,如果需要添加的实体集合的数据量较大,可以考虑使用或来实现实体的批量添加。

2022-12-19 14:34:00 296

原创 ASP.NET Core 3.1系列(18)——EFCore中执行原生SQL语句

前一篇博客介绍了中常见的一些查询操作,使用或结合实体类的操作相当方便。但在某些特殊情况下,我们仍旧需要使用原生来获取数据。好在EFCore中提供了完整的方法支持原生,下面开始介绍。与之前一样,还是使用和数据表,它们是一对多的关系,为表中的外键。表数据如下所示:表数据如下所示:代码如下:代码如下:代码如下:3、执行原生SQL查询操作3.1、FromSqlInterpolated如果是针对单表的查询操作,可以使用方法,但是该方法有以下局限性:下面将查询查询表中且的记录,代码如下:运行结果如下所示:

2022-12-06 17:45:44 443

原创 ASP.NET Core 3.1系列(17)——EFCore中的查询操作

在之前的时代,很多应用系统都会使用、、等类来实现数据库的操作,这种方法主要通过编写原生与数据库进行交互。而在中,微软则更推荐开发人员使用。虽然本质上仍是基于,但对于开发人员来说只需要使用的方式即可实现操作,因此从操作便捷性和开发效率上来说,无疑更具优势,下面就来介绍一些中关于查询的相关操作。在中新建一个数据库,创建作者表、书表,代码如下:这里的与为一对多的关系,为表中的外键。表数据如下所示:表数据如下所示:使用引入组件,如下所示:在控制台输入如下命令生成实体类与数据库上下文:代码如下:代码如下:

2022-12-06 09:34:02 383

原创 ASP.NET Core 3.1系列(16)——EFCore之Code First

前一篇博客介绍了EFCore中的DB First开发模式,该模式可以根据数据库生成实体类和数据库上下文,因此适用于数据库已经存在的场景。而与之相对应的,Code First主要是根据自定义的实体类和数据库上下文反向构建数据库,因此也可以看做是DB First的逆过程,下面开始介绍。新建一个Web API项目,使用NuGet新建实体类Author、数据库上下文User ID=sa;");get;set;");get;set;} } }>

2022-12-01 14:14:01 487

原创 ASP.NET Core 3.1系列(15)——EFCore之DB First

本文开始介绍一些关于的内容。在EFCore中,微软舍弃了,只保留了DB First和Code First模式,下面就来介绍一下如何在EFCore中使用DB First模式生成实体类和数据库上下文。本文主要介绍了一些关于EFCore中DB First开发模式的内容,对于命令中其他的参数含义及作用,有兴趣的同志也可以自行深入研究。如果你参与的项目之前就已经存在数据库,那么选用DB First模式可能会更加方便友好。

2022-11-30 10:25:37 518

原创 ASP.NET Core 3.1系列(14)——分布式缓存Redis的使用

前一篇博客介绍了中本地缓存的使用方法。相较于本地缓存,分布式缓存更加适合大多数项目应用场景,下面就来介绍一下如何在中对缓存进行相关操作。对于分布式缓存,微软提供了接口进行相关操作,该接口支持、、等多种缓存。其包含的方法如下所示:虽然接口提供的方法较少,但对于简单的缓存操作完全够用。本文以为例,因此需要使用引入如下程序包:引入相关组件后,需要在中添加相关服务,代码如下:2.1、创建缓存创建缓存的代码如下:运行程序,发现中已经创建了对应缓存,如下图所示:读取缓存的代码如下:运行程序,发现能够读取

2022-11-22 10:39:15 583 1

原创 ASP.NET Core 3.1系列(13)——本地缓存MemoryCache的使用

1、前言在实际开发过程中,缓存(Cache)是一项重要技术。有时候为了缓解数据库访问的压力,我们可以将一些需要经常读取但又几乎不会变化的数据存在缓存里,以此加快数据的访问速度。在ASP.NET Core中,缓存一般分为本地缓存和分布式缓存。相较于分布式缓存(Redis),本地缓存并不会将数据写入磁盘中,它只是将数据存储在内存中进行操作,因此本地缓存的数据会随着应用程序的重启而丢失。一般情况下,如果需要存储的数据不多,同时也没有数据持久化的要求,则可以考虑使用本地缓存。下面开始介绍其使用方法。2、本地缓存

2022-09-14 14:55:32 429

原创 ASP.NET Core 3.1系列(12)——使用Swagger构建Web API文档

1、前言在前后端分离的开发模式下,相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致,后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。因此,随着时间推移和版本迭代,接口文档往往很容易就跟不上代码了。这时候我们就需要使用Swagger来帮助我们自动构建API文档。Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。下面开始介绍如何在ASP.NET Core中使用它。2、配置Swagger2.1、

2022-04-25 15:54:41 398

原创 ASP.NET Core 3.1系列(11)——基于JSON文件的国际化多语言实现方法

1、前言前一篇博客介绍了基于资源文件(*.resx)的国际化多语言实现方法。但从个人角度来说,我并不是很喜欢这种做法,因为如果一个系统要支持5种国际语言,那么就代表一个Controller需要对应5个资源文件。而如果系统中有20个Controller,则表示需要创建100个资源文件。另一方面,如果从项目迁移的角度来考虑,之前的老项目可能都是把某个语言中的所有文本信息都写在了一个文件里,如果使用资源文件来处理,可能并不利于项目的迁移。下面就开始介绍如何利用JSON文件来实现多语言。2、创建JSON文件首

2022-04-25 10:42:58 500 1

原创 ASP.NET Core 3.1系列(10)——基于资源文件(*.resx)的国际化多语言实现方法

1、前言当软件需要在多个国家和地区使用时,对系统进行国际化多语言处理就成了顺理成章的事情。针对多语言场景,ASP.NET Core提供了一种基于资源文件(*.resx)的多语言实现方法,下面开始介绍。2、初级方法实现多语言在Controller的方法中,我们经常需要输出一些有意义的文本信息对用户进行提示,下面代码演示了根据不同的id值输出不同的提示信息:using Microsoft.AspNetCore.Mvc;namespace App.Controllers{ [Route("a

2022-04-24 16:53:51 953

原创 ASP.NET Core 3.1系列(9)——Cookie的相关操作

1、前言Cookie通常用来存储有关用户信息的一条数据,它可以用来标识登录用户,一般存储在客户端的浏览器上。在大多数浏览器中,每个Cookie都被存储为一个小文件,它一般采用键/值对的形式进行描述,因此可以利用键来读取、写入或删除Cookie。下面就来看看如何在ASP.NET Core中进行Cookie的设置、读取、删除操作。2、在Controller中操作Cookie如果是在Controller中直接操作Cookie,则直接使用如下两个组件即可:HttpContext.Response.Cook

2022-04-20 13:31:40 1482 2

原创 ASP.NET Core 3.1系列(8)——Controller中的方法返回值

1、前言在之前的博客中大家可能会发现一个问题:Controller中的方法返回值都是string类型。其实之前只是为了演示方便,所以才统一使用string来表示返回结果。总的来说,Controller中的方法返回值一般分成三类:一般数据类型、IActionResult、ActionResult<T>,下面开始逐一介绍。2、一般数据类型一般数据类型很简单,就是平时用到的int、double、string、IEnumerable等数据类型,代码如下所示:using Microsoft.Asp

2022-04-19 17:07:14 837

原创 ASP.NET Core 3.1系列(7)——Controller接收前端上传文件的方法

1、前言前一篇博客主要介绍了在GET和POST模式下Controller接收参数的一系列方法,归根结底还是一些简单类型参数的传递和接收。当前端界面需要上传文件时,后台的Controller又应该如何去接收呢?下面开始介绍。2、搭建前端界面这里使用LayUI搭建一个简易的前端界面实现多图片上传,代码如下:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <m

2022-04-19 10:44:55 2144

原创 ASP.NET Core 3.1系列(6)——GET和POST模式下Controller接收前端参数的几种方法

1、前言前一篇博客介绍了ASP.NET Core中的跨域设置,我们已经实现了前端界面对后台API的访问操作。不过很遗憾:到目前为止,测试代码中的Controller只包含一个不带任何参数的Get()方法,而在实际开发过程中,不管是GET还是POST请求,往往都包含着一些列参数。下面就来介绍一下如何在Controller中获取这些前端参数。2、GET请求模式2.1、搭建前端界面GET请求一般是将参数放在URL后面以?分隔,参数与参数之间使用&分隔,其一般格式如下所示:http://127.0

2022-04-18 15:11:35 3413 4

原创 ASP.NET Core 3.1系列(5)——Web API的跨域设置

1、前言现在流行前后端分离的开发模式,在最终部署项目时,前端项目和后端项目可能会被部署在不同的域名下,这就会导致跨域问题。而由于同源策略的约束,在一般情况下,浏览器不会允许一个域名中的网页去访问另一个域名中的资源,因此我们需要在Web API项目中进行跨域设置,下面开始介绍。2、搭建前后端项目2.1、搭建后台控制器后台项目URL为https://localhost:5001,新建一个控制器HomeController,添加一个Get和一个Post方法,代码如下,:using Microsoft.A

2022-04-17 20:44:35 1096

原创 ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json

1、前言在大多数的应用程序中,一些参数需要写在配置文件里,以此增加系统的灵活性。在ASP.NET时代,配置参数一般会写在web.config文件中,其本质上是对XML文件的读取和写入。而在ASP.NET Core中,配置文件变成了appsettings.json文件。相较于XML,JSON文件更加轻量且灵活,下面就来介绍一下如何在ASP.NET Core中对其进行读写操作。2、添加配置参数打开appsettings.json文件,添加如下配置项。如果对JSON文件的格式不熟悉,建议先了解一下其格式规范

2022-04-17 00:03:44 2514

原创 ASP.NET Core 3.1系列(3)——创建第一个Web API应用程序

1、前言前面两篇博客主要介绍了依赖注入和控制反转的相关概念以及.NET Core中内置IoC容器的使用方法,给出的代码实例也都是基于控制台程序。从这篇博客开始,我们将创建WebAPI应用程序进行演示。打开Visual Studio 2019,选择ASP.NET Core Web API,项目名称设置为App,版本选择.NET Core 3.1,工程创建完毕后如下图所示,解决方案资源管理器会显示如下图所示的内容,下面就来说一说这些文件的用处。2、launchSettings.json{ "$s

2022-04-14 16:47:34 642

原创 ASP.NET Core 3.1系列(2)——.NET Core中内置的IoC容器

1、前言作为.NET Core中最为重要的概念,依赖注入和控制反转可谓是无处不在,因此微软也为我们提供一个内置的IoC容器,下面就来介绍一下它的使用方法。2、内置的IoC容器创建一个控制台程序,引入如下两个组件,版本选择3.1.23,如下图所示:1、Microsoft.Extensions.DependencyInjection2、Microsoft.Extensions.DependencyInjection.Abstractions还是使用之前的例子,这次我们使用.NET Core内置的

2022-04-11 16:28:09 1343

原创 ASP.NET Core 3.1系列(1)——依赖注入和控制反转

1、前言很长时间没写博客了,今年的主要任务就是把原先.NET Framework平台的项目迁移到.NET Core平台,在研究了一阵子后,我发现.NET Core实在是让人爱不释手,所以还没入坑的小伙伴可要抓紧了,争取早日体验一把真香定律。言归正传,由于现在的项目采用的都是前后端分离模式,因此本系列博客主要介绍ASP.NET Core中的WebAPI开发模式,开发环境为Visual Studio 2019,数据库选择SQL Server 2019,缓存数据库选择Redis。本文主要介绍依赖注入和控制反转的

2022-04-11 15:30:32 1197

原创 Entity Framework使用Repository+UnitOfWork实现单表CRUD

1、前言最近一直在研究Repository+UnitOfWork的开发模式,下面贴一下自己写的代码,如果有不对的地方欢迎大家批评指正。2、IDbContext定义这个接口主要是为了不依赖于具体的数据库上下文,代码如下:using System.Data.Entity;using System.Data.Entity.Infrastructure;namespace ConsoleApp{ public interface IDbContext { /// &l

2021-12-31 11:04:16 468

原创 Entity Framework新增、修改、删除单个实体的几种方式

1、前言在Entity Framework中,单个实体的新增、修改、删除有多种方法,每种方法在后台生成的SQL也有一些区别,下面开始介绍。2、新增实体新增实体有两种方法,第一种方法就是调用DbSet.Add(),代码如下:using EFApp.Models;namespace EFApp{ class Program { static void Main(string[] args) { DaoContext conte

2021-12-17 15:14:29 1153

原创 ArcEngine编辑模块——构造平行线的方法

1、前言在ArcEngine中,平行线的构造主要使用IConstructCurve接口实现,如果你想在生成平行线的同时对平行线的拐点进行一些特殊处理,那就需要使用IConstructCurve4接口,下面开始介绍。2、构造一般平行线构造一般平行线需要使用IConstructCurve接口的ConstructOffset方法,代码如下:using ESRI.ArcGIS.ADF.BaseClasses;using ESRI.ArcGIS.ADF.CATIDs;using ESRI.ArcGIS.C

2021-11-30 00:34:59 474

原创 ArcEngine编辑模块——将线段按距离、按比例分割成N条线段

1、前言前面一篇博客介绍了如何按距离或按比例将1条线段分成2条线段的方法,核心就是利用IFeatureEdit接口的Split方法进行分割。但就像之前说的,该方法只适用于将1条线段分成2条线段,如果我们希望将1条线段分成n条线段(n >= 2),那又该怎么做呢?下面开始介绍。2、获取分割点假设有一条长度为100米的线段,现在按照30米的距离间隔对其进行分割,那么就会得到如下图所示的结果,线段被A、B、C三个分割点分成了4份,现在第一个问题来了:如何获取这些分割点?其实这个问题很简单,在IPo

2021-11-27 22:49:27 657 6

原创 ArcEngine编辑模块——将线段按距离、按比例分割成两部分

1、前言在ArcEngine中,线段的分割主要使用IFeatureEdit接口的Split方法实现。需要注意的是:该方法只能将1条线段按距离或按比例分割成 2条线段,关于如何将1条线段分成n条线段(n >= 2)的方法我会在下一篇博客介绍,下面给出实现代码。2、线段分割2.1、主界面代码using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.SystemUI;using System;using System.Windows.Forms;using W

2021-11-27 19:04:54 520

原创 ArcEngine编辑模块——批量删除要素

1、前言在ArcEngine中,删除要素的方法有很多,你可以使用IFeatureCursor或ITable查询出部分要素然后依次删除。但这两个接口只能针对单个图层的要素进行删除,而在编辑状态下,我们可能一次选中了多个图层下的多个要素,这时候就得使用IFeature接口的Delete方法进行操作,下面给出实现代码。2、删除要素2.1、主界面代码using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.SystemUI;using System;using Syst

2021-11-27 16:01:29 805 1

原创 ArcEngine编辑模块——批量旋转要素

1、前言在ArcEngine中,要素的批量旋转可以使用IFeatureEdit实现,下面给出实现代码。2、旋转要素2.1、主界面代码using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.SystemUI;using System;using System.Windows.Forms;using WindowsFormsApplication1.Command;namespace WindowsFormsApplication1{ public

2021-11-26 20:25:22 383

原创 ArcEngine实现运动轨迹的播放

1、前言在ArcEngine中,轨迹播放的实现方法很简单:创建一个定时器Timer在定时器的Tick事件中绘制IElement我这里做了一个例子,效果如下图所示:2、实现方法using ESRI.ArcGIS.Carto;using ESRI.ArcGIS.Display;using ESRI.ArcGIS.Geodatabase;using ESRI.ArcGIS.Geometry;using System;using System.Windows.Forms;namesp

2021-11-25 23:09:49 573 6

原创 ArcEngine编辑模块——创建要素

1、前言在ArcEngine中,创建要素一般分为两部分,即:设置空间信息、设置属性信息。下面给出实现代码。2、定义实体类首先在ArcMap中创建一个点文件,其属性字段如下表所示:字段名称字段类型FID整型Shape几何Longitude(经度)双精度Latitude(纬度)双精度SchoolName(学校名称)文本SchoolType(学校类型)文本根据该属性表创建一个实体类——SchoolModel,代码如下:using Sys

2021-11-23 21:16:10 1074 9

原创 ArcEngine编辑模块——移动多个要素的实现方法

1、前言前一篇博客介绍了在ArcEngine中移动单个要素的实现方法,这篇博客来介绍一下如何移动多个要素。移动多个要素需要使用IMoveGeometryFeedback接口,下面给出实现方法。2、移动多个要素跟上一篇博客一样,首先搭建一个如下图所示的界面:2.1、主界面代码using System;using System.Windows.Forms;using ESRI.ArcGIS.Controls;using ESRI.ArcGIS.SystemUI;using EditApp.C

2021-11-19 22:51:52 591

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除