C# Winform程序调用WebApi接口实现增删改查(CRUD)实例源码教程

摘要:
以下说明Winform接口如何调用WebApi接口来添加、删除、修改和检查。下图是CSFramework.WebApi后端开发框架测试程序的主界面,以单表数据操作界面的演示为例进行说明。CRUD是指在计算过程中添加、读取、更新和删除几个单词的缩写。CRUD主要用于描述软件系统中数据库或持久层的基本操作功能=“txt”)continue;如果{TextBoxBaseedit=editorPanel.Controls[i]asTextBoxBase;fieldName=edit.Name.Substring;edit.DataBindings.Clear();Bindingb=newBinding;edit.DataBindings.Add;//绑定数据源b.ReadValue();}}保存按钮事件:C#Code://Saveevent privatevoidbtnSave_单击{//调用业务层保存方法ModelResponsesult=newllCustomer().Post;如果{ListList=newList();List.Add;dataGridView1,则{//刷新缓存。DataSource=list;}否则{如果{List<Entity_Customer>List=dataGridView1。DataSourceasList;列表添加dataGridView1.DataSource=null;dataGridView1.DataSource=list;dataGridView1.Ro-ws[dataGridView1。排。Count-1].Selected=真;dataGridView1.CurrentCell=dataGridView1[0,dataGridView1.行.Count-1];}如果{Entity_Customer=dataGridView1.SelectedCells[0].OwningRow.DataBoundItemasEntity_Customer;CSFramework.WebApi.Core.WebApiDataConverter.CopyObject;}}_模式=“视图”;设置按钮状态();MessageBox。显示(“成功保存!
下面讲解Winform界面怎样调用WebApi接口实现增、删、改、查(CRUD),下图是CSFramework.WebApi后端开发框架测试程序主界面,以单表数据操作界面演示(Customer:客户管理)为例进行讲解。
 
Winform调用WebApi接口实现增删改查CRUD实例源码
 
 
CRUD是什么?
 
CRUD是指在做计算处理时的增加(Create)、读取(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能。
 

 
CSFramework.WebApi后端开发框架测试程序主界面:
 
点【基础资料(Customer,Object Entity)】按钮打开【客户资料管理】管理界面。
 


贴图图片-Winform调用WebApi接口实现增删改查CRUD实例源码

 
 
一、实现新增功能(Create)
 
 

贴图图片-Winform调用WebApi接口实现增删改查CRUD实例源码1

 
 
新增按钮事件:

C# Code:

//新增客户
private void btnAdd_Click(object sender, EventArgs e)
{
  _Mode = "Add";
  
  //创建客户实体对象
   _Current = new Entity_Customer();
  _Current.CreatedBy = "admin";
  _Current.CreationDate = DateTime.Now;
  
  //绑定主表文本框数据源
   DoBindingEditorPanel(panel3, _Current);
  
  //设置按钮状态
   SetButtonState();
  
  tabControl1.SelectedTab = tabPage2;
  txtCustomerCode.ReadOnly = false;
}

//来源:C/S框架网(www.csframework.com) QQ:23404761
 
新建一条记录,首先要创建实体对象,然后绑定编辑界面文本框架的数据源(显示数据)。
 
 
动态绑定资料编辑组件文本框的数据源:

C# Code:

/// <summary>
/// 动态绑定资料编辑组件的数据源
/// </summary>
/// <param name="editorPanel"></param>
/// <param name="dataSource"></param>
private void DoBindingEditorPanel(Control editorPanel, object dataSource)
{
  string fieldName = "";
  
  for (int i = 0; i <= editorPanel.Controls.Count - 1; i++)
  {
    //匹配:txt字段名(属性名)的组件,如:txtCustomerCode, txtCustomerName
     if (editorPanel.Controls[i].Name.Substring(0, 3) != "txt") continue;
    
    if (editorPanel.Controls[i] is TextBoxBase)
    {
      TextBoxBase edit = editorPanel.Controls[i] as TextBoxBase;
      
      fieldName = edit.Name.Substring(3, edit.Name.Length - 3);
      edit.DataBindings.Clear();
      Binding b = new Binding("Text", dataSource, fieldName);
      edit.DataBindings.Add(b);//绑定数据源
       b.ReadValue();
    }
  }
}

 
保存按钮事件:

C# Code:

//保存事件
private void btnSave_Click(object sender, EventArgs e)
{
  //调用业务层保存方法
   ModelResponse result = new bllCustomer().Post(_Current, _Mode);
  
  if (result.Code == 0)
  {
    //刷新缓存
     if (dataGridView1.DataSource == null)
    {
      List<Entity_Customer> list = new List<Entity_Customer>();
      list.Add(_Current);
      dataGridView1.DataSource = list;
    }
    else
    {
      if (_Mode == "Add")
      {
        List<Entity_Customer> list = dataGridView1.DataSource as List<Entity_Customer>;
        list.Add(_Current);
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = list;
        
        dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;
        dataGridView1.CurrentCell = dataGridView1[0, dataGridView1.Rows.Count - 1];
      }
      if (_Mode == "Edit")
      {
        Entity_Customer customer = dataGridView1.SelectedCells[0].OwningRow.DataBoundItem asEntity_Customer;
        CSFramework.WebApi.Core.WebApiDataConverter.CopyObject(_Current, customer);
      }
    }
    
    _Mode = "View";
    SetButtonState();
    MessageBox.Show("保存成功!");
  }
  else
  {
    MessageBox.Show("保存失败! " + result.Message);
  }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761
 

提交资料,调用WebApi接口:
 

C# Code:


/// <summary>
/// 保存数据
/// </summary>
/// <param name="model"></param>
/// <param name="mode"></param>
/// <returns></returns>
internal ModelResponse Post(Entity_Customer model, string mode)
{
  string data = JsonConvert.SerializeObject(model);
  ModelRequestAction request = ModelExample.GetRequestAction("admin", "", "WebApi_TestDB", 800001, mode, data, false);
  
  string result = WebApiTools.Post(_URL, JsonConvert.SerializeObject(request, JsonSettings.Current), HttpContentType.Application_JSON);
  ModelResponse response = JsonConvert.DeserializeObject<ModelResponse>(result);
  return response;
}

//来源:C/S框架网(www.csframework.com) QQ:23404761


 
二、实现删除功能(Delete)
 
 
首先在表格中选择一条记录,点【删除】按钮。
 
C# Code:

//删除按钮事件
private void btnDelete_Click(object sender, EventArgs e)
{
  if (dataGridView1.RowCount <= 0) return;
  
  Entity_Customer customer = dataGridView1.SelectedCells[0].OwningRow.DataBoundItem asEntity_Customer;
  
  //调用接口删除记录
   bool ok = new bllCustomer().Delete(customer.CustomerCode);
  
  if (ok)
  {
    List<Entity_Customer> data = (dataGridView1.DataSource as List<Entity_Customer>);
    data.Remove(customer);
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = data;
    
    //显示下一条记录
     if (tabControl1.SelectedIndex == 1 && dataGridView1.Rows.Count > 0)
    btnView_Click(btnView, new EventArgs());
    
    MessageBox.Show("删除成功");
  }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761



C# Code:

/// <summary>
/// 删除数据,调用WebApi接口
/// </summary>
/// <param name="PONO"></param>
/// <returns></returns>
internal bool Delete(string customerCode)
{
  ModelRequestAction request = ModelExample.GetRequestAction("admin", "", "WebApi_TestDB", 800001, "Delete", PONO, false);
  string result = WebApiTools.Post(_URL, JsonConvert.SerializeObject(request, JsonSettings.Current), HttpContentType.Application_JSON);
  ModelResponse response = JsonConvert.DeserializeObject<ModelResponse>(result);
  return response.Code == 0;
}

//来源:C/S框架网(www.csframework.com) QQ:23404761
 


三、实现修改功能(Update)
 
 
修改一条记录,首先要获取当前记录的数据并转换为实体对象,然后在界面显示数据(绑定对象的数据源)。
 

C# Code:

//查看详情按钮事件
private void btnView_Click(object sender, EventArgs e)
{
  if (dataGridView1.RowCount <= 0) return;
  
  _Mode = "View";
  
  Entity_Customer customer = dataGridView1.SelectedCells[0].OwningRow.DataBoundItem asEntity_Customer;
  
  _Current = new bllCustomer().GetDataByKey(customer.CustomerCode);
  
  //绑定主表文本框数据源
   DoBindingEditorPanel(panel3, _Current);
  
  SetButtonState();
  tabControl1.SelectedTab = tabPage2;
}

//来源:C/S框架网(www.csframework.com) QQ:23404761
 
 
根据主键获取客户资料:
 

C# Code:

/// <summary>
/// 获取客户资料
/// </summary>
/// <param name="customerCode"></param>
/// <returns></returns>
public Entity_Customer GetDataByKey(string customerCode)
{
  ModelRequestAction request = ModelExample.GetRequestAction("admin", "", "WebApi_TestDB", 800001, "View", customerCode, false);
  
  string result = WebApiTools.Post(_URL, JsonConvert.SerializeObject(request, JsonSettings.Current), HttpContentType.Application_JSON);
  ModelResponse response = JsonConvert.DeserializeObject<ModelResponse>(result);
  if (response.Code == 0)
  return JsonConvert.DeserializeObject<Entity_Customer>(response.Data);
  else
  return null;
}

//来源:C/S框架网(www.csframework.com) QQ:23404761


 
四、实现查询功能 (Retrieve)
 
 
查询按钮事件:
 

C# Code:

//查询客户资料
private void btnQuery_Click(object sender, EventArgs e)
{
  //查询参数 
   dynamic queryParam = new
  {
    CustomerCode = txt_CustomerCode.Text,
    NativeName = txt_NativeName.Text
    };
    
    dataGridView1.AutoGenerateColumns = false;
    dataGridView1.DataSource = new bllCustomer().Query(queryParam);
    
    if (dataGridView1.DataSource == null) MessageBox.Show("查询资料失败!");
  }
  
  //来源:C/S框架网(www.csframework.com) QQ:23404761
 

BLL.Query方法:
 

C# Code:

/// <summary>
/// 查询客户资料
/// </summary>
/// <param name="paramObject">查询参数,动态对象模型</param>
/// <returns></returns>
public List<Entity_Customer> Query(dynamic paramObject)
{
  string dataJson = JsonConvert.SerializeObject(paramObject, JsonSettings.Current);
  
  //创建WebApi接口请求对象
   ModelRequestAction request = ModelExample.GetRequestAction("admin", "", "WebApi_TestDB", 800001, "Query", dataJson, false);
  
  //提交,POST
   string result = WebApiTools.Post(_URL, JsonConvert.SerializeObject(request, JsonSettings.Current), HttpContentType.Application_JSON);
  ModelResponse response = JsonConvert.DeserializeObject<ModelResponse>(result);
  if (response.Code == 0)
  return JsonConvert.DeserializeObject<List<Entity_Customer>>(response.Data);
  else
  return null;
}



 
创建WebApi接口请求对象:


C# Code:

/// <summary>
/// 创建WebApi接口请求对象
/// </summary>
/// <param name="userID">用户账号,对应用户表的Account字段</param>
/// <param name="token">令牌,登录成功后自动分配</param>
/// <param name="actionID">接口编号、功能编号</param>
/// <param name="op">具体操作,如:Add/Delete/Edit/Query</param>
/// <param name="data">本次操作数据,如Op=Query,Data可以是查询条件</param>
/// <param name="dataEncrypt">数据是否加密</param>
/// <returns></returns>
public static ModelRequestAction GetRequestAction(string userID, string token, string dbid, intactionID, string op, string data, bool dataEncrypt = true)
{
  //Request.Data数据对象
   ModelRequestClientData M = new ModelRequestClientData();
  M.UserID = userID;
  M.Token = token;
  M.DBID = dbid;
  
  string clientData = JsonConvert.SerializeObject(M, JsonSettings.Current);
  
  //Request请求主体对象
   ModelRequestAction mr = new ModelRequestAction();
  mr.Timestamp = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  mr.Operation = op;
  mr.Action = actionID;
  mr.ApiKey = PrivateData.apikey;//公钥
   mr.Data = dataEncrypt ? CryptoHelper.DESEncrypt(data, PrivateData.DES_Key, PrivateData.DES_iv) : data;
  mr.Sign = CryptoHelper.ToMD5(mr.ApiKey + mr.Data + PrivateData.secret + mr.Timestamp);//Sign数字签名
   mr.DataIsEncrypted = dataEncrypt;
  mr.ClientData = clientData;
  
  return mr;
}

 


WebApi服务端实现:

实现命令层,Cmd_Test_Customer:

贴图图片-Winform调用WebApi接口实现增删改查CRUD实例源码2

 
 
Cmd_Test_Customer.Execute执行方法:

C# Code:

/// <summary>
/// 执行命令
/// </summary>
/// <returns></returns>
public override IUserResponse Execute()
{
  //新增
   if (_UserRequest.Operation == CommandOperation.Add.ToString())
  {
    Entity_Customer customer = _UserRequest.GetDataObject<Entity_Customer>();
    
    DataTable dtTmp = _DAL.GetDataByKey("-");
    WebApiDataConverter.AddObject2Table(customer, dtTmp);
    
    bool ok = _DAL.Update(dtTmp);
    return new ModelResponse { Code = ok ? 0 : -1, Message = "操作" + (ok ? "成功" : "失败") };
  }
  
  //删除
   if (_UserRequest.Operation == CommandOperation.Delete.ToString())
  {
    bool ok = _DAL.Delete(_UserRequest.Data);
    return new ModelResponse { Code = ok ? 0 : -1, Message = "操作" + (ok ? "成功" : "失败") };
  }
  
  //修改
   if (_UserRequest.Operation == CommandOperation.Edit.ToString())
  {
    Entity_Customer customer = _UserRequest.GetDataObject<Entity_Customer>();
    
    DataTable dtTmp = _DAL.GetDataByKey("-");
    WebApiDataConverter.AddObject2Table(customer, dtTmp);
    dtTmp.AcceptChanges();
    dtTmp.Rows[0].SetModified();
    
    bool ok = _DAL.Update(dtTmp);
    return new ModelResponse { Code = ok ? 0 : -1, Message = "操作" + (ok ? "成功" : "失败") };
  }
  
  //查询
   if (_UserRequest.Operation == CommandOperation.Query.ToString())
  {
    dynamic data = JsonConvert.DeserializeObject<dynamic>(_UserRequest.Data);//测试动态对象
     List<Entity_Customer> list = _DAL.Query(data);
    
    return new ModelResponse
    {
      Code = 0,
      Message = "操作成功",
      Data = JsonConvert.SerializeObject(list)
      };
    }
    
    //查询-根据主键查询一条记录
     if (_UserRequest.Operation == "GetCustomer")
    {
      List<Entity_Customer> list = _DAL.QueryByKey(_UserRequest.Data);
      
      return new ModelResponse
      {
        Code = 0,
        Message = "操作成功",
        Data = list.Count > 0 ? JsonConvert.SerializeObject(list) : ""
        };
      }
      
      //根据主键值获取详情
       if (EqualsOP(_UserRequest.Operation, CommandOperation.View))//GetDataByKey
       {
      Entity_Customer customer = _DAL.Get(_UserRequest.Data);
      return new ModelResponse
      {
        Code = 0,
        Message = "操作成功",
        Data = JsonConvert.SerializeObject(customer)
        };
      }
      
      return new ModelResponse
      {
        Code = ErrorCodes.InterfaceIdInvalide,
        Message = ErrorCodes.InterfaceIdInvalide_Msg
        };
      }
      
      //来源:C/S框架网(www.csframework.com) QQ:23404761


数据访问层:

C# Code:

/// <summary>
/// 客户管理,数据层
/// </summary>
public class dalCustomer : dalBaseDataDict
{
  public dalCustomer(IUserRequestClientLogin loginer)
  {
    if (loginer != null)
    _Database = DatabaseProvider.GetDatabase(loginer.DBID);
    else
    _Database = DatabaseProvider.GetDatabase("WebApi_TestDB");
    
    this.ORM = typeof(Entity_Customer);
  }
  
  public override DataTable GetSummaryData()
  {
    string sql = "SELECT * FROM tb_Customer ORDER BY CreationDate DESC";
    return _Database.GetTable(sql, _TableName);
  }
  
  protected override IGenerateSqlCommand CreateSqlGenerator(string tableName)
  {
    Type ORM = null;
    
    if (tableName == Entity_Customer.__TableName) ORM = typeof(Entity_Customer);
    
    if (ORM == null) throw new Exception(tableName + "表没有ORM模型!");
    
    return new GenerateSqlCmdByObjectClass(_Database, ORM);
  }
  
  public List<Entity_Customer> Query(dynamic data)
  {
    string sql = "SELECT * FROM dbo.tb_Customer WHERE 1=1";
    if (data.CustomerCode.ToString() != "") sql += " AND CustomerCode LIKE '%" + data.CustomerCode + "%'";
    if (data.NativeName.ToString() != "") sql += " AND NativeName LIKE '%" + data.NativeName + "%'";
    
    List<Entity_Customer> list = _Database.ExecuteReader<Entity_Customer>(sql, row =>WebApiDataConverter.Convert2Object<Entity_Customer>(row));
    return list;
  }
  
  public List<Entity_Customer> QueryByKey(string key)
  {
    string sql = "SELECT * FROM dbo.tb_Customer WHERE CustomerCode ='" + key + "'";
    
    List<Entity_Customer> list = _Database.ExecuteReader<Entity_Customer>(sql, row =>WebApiDataConverter.Convert2Object<Entity_Customer>(row));
    return list;
  }
  
  public Entity_Customer Get(string customerCode)
  {
    string sql = "SELECT * FROM dbo.tb_Customer WHERE CustomerCode='" + customerCode + "'";
    Entity_Customer customer = _Database.ExecuteReader<Entity_Customer>(sql);
    return customer;
  }
}

//来源:C/S框架网(www.csframework.com) QQ:23404761
 
 
CSFramework.WebApi后端开发框架测试程序,VS2017解决方案完整版:
 
 
贴图图片-Winform调用WebApi接口实现增删改查CRUD实例源码3
 
 
<本文完>
 
C# Winform程序调用WebApi接口实现增删改查(CRUD)实例源码教程第6张

 

.NET WebApi开发框架|MVC框架|后端框架|服务端框架-标准版V1.0

 
适用开发 适用开发:快速构建支持多种客户端的服务端程序,支持APP、B/S、C/S跨平台移动终端等。
运行平台 运行平台:Windows + .NET Framework 4.5
开发工具 开发工具:Visual Studio 2015+,C#语言
数据库 数据库:Microsoft SQLServer 2008R2+(支持多数据库:Oracle/MySql)

WebApi服务端开发框架
 
 
WebApi开发框架:http://www.csframework.com/cs-framework-webapi-1.0.htm
 
 
本文转自:Winform调用WebApi接口实现增删改查CRUD实例源码
http://www.csframework.com/archive/1/arc-1-20200226-2748.htm
 

免责声明:文章转载自《C# Winform程序调用WebApi接口实现增删改查(CRUD)实例源码教程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇致远oa漏洞payload分析SSL连接建立过程分析(1)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

实验 1 : Mininet 源码安装 和可视化拓扑工具

实验 1 : Mininet 源码安装 和可视化拓扑工具 一、 实验 目的 掌握 Mininet 的源码安装方法和 miniedit 可视化拓扑生成工具。 二 、实验 任务 使用源码安装 Mininet 的 2.3.0d6 版本,并使用可视化拓扑工具生成一个最简拓扑(1 台交换机连接 2 台主机)。 三 、 实验步骤 1. 实验环境 安装了...

iOS开发数据库篇—SQL

一、SQL语句 如果要在程序运行过程中操作数据库中的数据,那得先学会使用SQL语句 1.什么是SQL SQL(structured query language):结构化查询语言 SQL是一种对关系型数据库中的数据进行定义和操作的语言 SQL语言简洁,语法简单,好学好用 2.什么是SQL语句 使用SQL语言编写出来的句子代码,就是SQL语句 在程序运行...

Flink 如何实时分析 Iceberg 数据湖的 CDC 数据

简介: 数据湖的架构中,CDC 数据实时读写的方案和原理 本文由李劲松、胡争分享,社区志愿者杨伟海、李培殿整理。主要介绍在数据湖的架构中,CDC 数据实时读写的方案和原理。文章主要分为 4 个部分内容: 常见的 CDC 分析方案 为何选择 Flink + Iceberg 如何实时写入读取 未来规划 一、常见的 CDC 分析方案 我们先看一下今天的 to...

Winform中对自定义xml配置文件进行Xml节点的添加与删除

场景 Winform中自定义xml配置文件后对节点进行读取与写入: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100532137 在上面已经对xml配置文件对节点能进行读取与写入之后 ,实现对节点元素的 添加与删除。 关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。大量...

winform 中 MessageBox 用法大全

(转自:http://blog.csdn.net/xuenzhen123/article/details/4808005)  MessageBox.Show()共有21中重载方法。现将其常见用法总结如下:   1.MessageBox.Show(“Hello~~~~”); 最简单的,只显示提示信息。 2.MessageBox.Show(“There ar...

不知道怎么提高代码可扩展性?来看看优秀框架源码中的这几种设计模式吧!

为什么要提高代码扩展性 我们写的代码都是为了一定的需求服务的,但是这些需求并不是一成不变的,当需求变更了,如果我们代码的扩展性很好,我们可能只需要简单的添加或者删除模块就行了,如果扩展性不好,可能所有代码都需要重写,那就是一场灾难了,所以提高代码的扩展性是势在必行的。怎样才算有好的扩展性呢?好的扩展性应该具备以下特征: 需求变更时,代码不需要重写。 局部...