C# Winform程序調用WebApi接口實現增刪改查(CRUD)實例源碼教程


下面講解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("保存失敗!\r\n" + 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
 
 
<本文完>
 

 

.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服務端開發框架
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM